You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:57:11