R语言使用AV包顺序拼接多段视频时仅保留首段音频问题求助
问题根因
av::av_encode_video()的audio参数不支持自动拼接多段传入的音频源:当给该参数传入多个文件路径时,函数仅会读取向量中第一个文件的音轨,与拼接完成的视频流封装输出,不会自动追加后续文件的音频内容,因此会出现仅第一段视频有声音、后续片段音频截断的现象,和源素材本身无关。
纯R环境实现方案(无需调用命令行ffmpeg)
依托av包自带的音频读写能力分两步处理即可,全程在R环境内完成,不需要额外调用命令行工具:
- 第一步:逐段提取所有待拼接视频的音轨,按顺序合并为一段完整的临时音频文件
- 第二步:调用视频拼接逻辑时,传入已经合并完成的完整音频作为输出文件的音轨,而非直接传入原视频列表
可直接运行的参考代码如下:
library(av) # 路径配置 work_dir <- "C:/Users/Admin/Documents/r_programs/" video_list <- c( paste0(work_dir, "video_1.mp4"), paste0(work_dir, "video_2.mp4"), paste0(work_dir, "video_3.mp4") ) temp_merged_audio <- paste0(work_dir, "temp_audio_merged.wav") final_output <- paste0(work_dir, "output.mp4") # -------------------------- # 步骤1:按顺序拼接所有音轨 # -------------------------- # 取第一个视频的音频参数作为统一标准,避免音轨参数不兼容 base_audio_config <- av_media_info(video_list[1])$audio # 初始化临时音频写入器 audio_con <- av_audio_open( filename = temp_merged_audio, channels = base_audio_config$channels, sample_rate = base_audio_config$sample_rate, codec = "pcm_s16le" ) # 逐段读取每个视频的音频,写入临时合并文件 for (single_vid in video_list) { vid_audio_data <- av_capture_audio( audio = single_vid, sample_rate = base_audio_config$sample_rate, channels = base_audio_config$channels ) av_audio_write(audio_con, vid_audio_data) } # 关闭音频连接完成写入 close(audio_con) # -------------------------- # 步骤2:合并视频+完整音轨输出 # -------------------------- av_encode_video( input = video_list, output = final_output, framerate = 30, vfilter = "null", codec = "libx264rgb", audio = temp_merged_audio, verbose = TRUE ) # 清理临时音频文件 file.remove(temp_merged_audio)
注意事项
- 上述代码在读取每段视频音频时,会统一转成和第一个视频一致的采样率、声道数,即使不同源视频的音轨参数有小幅差异,也能正常完成拼接,不会出现音轨兼容问题。
- 由于音频是逐段从对应原视频中提取的,和对应片段的视频时长完全匹配,不会出现音画不同步的问题。
- 不要直接给
av_encode_video()的audio参数传入多文件向量,该参数仅支持接收单个音频源作为整个输出视频的音轨。
内容的提问来源于stack exchange,提问作者Jack Cornwall
相关产品推荐
相关产品推荐

