如何用FFmpeg的concat合并包含无声视频片段的文件?
解决FFmpeg混合无声/有声视频合并的问题
你的原命令报错是因为concat demuxer要求所有输入文件的流数量、编码参数完全一致——无声视频没有音频流,有声视频有,直接用-c copy会导致流不匹配,最终输出丢失音频。下面给你两种可行方案:
方案一:预处理无声视频,添加静音音频
先给所有无音频的PPT导出视频添加静音流,再用原concat逻辑合并:
- 对每个无声视频执行以下命令,生成带静音音频的版本(以
title.mp4为例):
ffmpeg -i title.mp4 -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -c:v copy -c:a aac title_with_audio.mp4
- 若你的有声视频音频参数不同(比如采样率是48000),可先用
ffprobe welcome.mp4查看,再修改anullsrc的对应参数。
- 修改
videos.txt,把所有无声视频的文件名替换成处理后的带音频版本,比如把file 'title.mp4'改成file 'title_with_audio.mp4'。 - 执行合并命令(如果所有视频编码参数一致,可保留
-c copy加速;否则去掉-c copy让FFmpeg自动重新编码):
ffmpeg -f concat -i videos_updated.txt -c:v copy -c:a copy output.mp4
方案二:用filter_complex一次性处理合并(无需预处理)
直接通过滤镜链给无声视频实时添加静音,同时合并所有视频,一步到位:
ffmpeg \ -i title.mp4 \ -i welcome.mp4 \ -i introductions_slide.mp4 \ -i introductions.mp4 \ -i presentation_part_1_slide.mp4 \ -i presentation_part_1.mp4 \ -i presentation_part_2_slide.mp4 \ -i presentation_part_2a.mp4 \ -i presentation_part_2b.mp4 \ -i questions_and_answers_slide.mp4 \ -i questions_and_answers.mp4 \ -filter_complex " # 处理无声视频:保留视频流,生成静音音频流 [0:v]setpts=PTS-STARTPTS[v0]; anullsrc=channel_layout=stereo:sample_rate=44100[a0]; # 处理有声视频:同步视频/音频时间轴 [1:v]setpts=PTS-STARTPTS[v1]; [1:a]asetpts=PTS-STARTPTS[a1]; # 重复上述逻辑处理剩余视频 [2:v]setpts=PTS-STARTPTS[v2]; anullsrc=channel_layout=stereo:sample_rate=44100[a2]; [3:v]setpts=PTS-STARTPTS[v3]; [3:a]asetpts=PTS-STARTPTS[a3]; [4:v]setpts=PTS-STARTPTS[v4]; anullsrc=channel_layout=stereo:sample_rate=44100[a4]; [5:v]setpts=PTS-STARTPTS[v5]; [5:a]asetpts=PTS-STARTPTS[a5]; [6:v]setpts=PTS-STARTPTS[v6]; anullsrc=channel_layout=stereo:sample_rate=44100[a6]; [7:v]setpts=PTS-STARTPTS[v7]; [7:a]asetpts=PTS-STARTPTS[a7]; [8:v]setpts=PTS-STARTPTS[v8]; [8:a]asetpts=PTS-STARTPTS[a8]; [9:v]setpts=PTS-STARTPTS[v9]; anullsrc=channel_layout=stereo:sample_rate=44100[a9]; [10:v]setpts=PTS-STARTPTS[v10]; [10:a]asetpts=PTS-STARTPTS[a10]; # 合并所有处理后的流,n=11对应11个输入视频 [v0][a0][v1][a1][v2][a2][v3][a3][v4][a4][v5][a5][v6][a6][v7][a7][v8][a8][v9][a9][v10][a10]concat=n=11:v=1:a=1[v][a] " \ -map "[v]" -map "[a]" -c:v libx264 -c:a aac output.mp4
内容的提问来源于stack exchange,提问作者Patrick Vellia
相关产品推荐
相关产品推荐

