如何使用FFmpeg稳定拼接含/不含音频的视频文件?
如何使用FFmpeg稳定拼接含/不含音频的视频文件?
我最近也碰到过一模一样的难题——手里攒着一堆视频文件,少则5个,多的时候能有上百个,有的带音频轨道,有的完全没声音。而且为了拼接不出错,我还得先把所有视频统一尺寸(比如用-vf "320:240"强制缩放,SAR和DAR的问题先放一边,唉,这部分真的头大),最终目标就是把这些零散的视频拼成一个完整的文件。
之前我也试过各种官方资料里的方法,比如外部列表文件的拼接方式,但总是不稳定,踩了好几个坑。折腾半天后,我琢磨出用FFmpeg的-filter_complex滤镜脚本来实现,稳定性靠谱多了,思路大概是这样:
第一步:先统一视频尺寸(可选但强烈推荐)
如果你的视频尺寸参差不齐,先批量把它们转成相同分辨率,避免拼接时出错。单文件处理命令是:
ffmpeg -i 你的原视频.mp4 -vf "scale=320:240" -c:a copy 缩放后的视频.mp4
要是原视频本身没有音频,这个命令也会保留无音频的状态,不用额外调整。
第二步:编写滤镜脚本文件(比如命名为combine.txt)
这个脚本用来定义每个输入文件的流,以及拼接规则,示例内容如下:
# 逐个引入视频文件,带音频的要同时声明视频和音频流 [in0:v][in0:a] movie="sample0_scaled.mp4" # 带音频的视频 [in1:v] movie="sample1_scaled.mp4" # 无音频的视频 [in2:v][in2:a] movie="sample2_scaled.mp4" # 带音频的视频 # 拼接所有视频流:n=3表示总共有3个视频输入,v=1表示处理视频轨道 [v_concat] concat=n=3:v=1:a=0 [v_out] # 拼接所有存在的音频流:n=2表示这里有2个音频输入,a=1表示处理音频轨道 [a_concat] concat=n=2:v=0:a=1 [a_out] # 把拼接好的视频和音频合并成最终输出流 [v_out][a_out] concat=n=1:v=1:a=1 [final_out]
- 要是某个视频没有音频,只写
[inX:v] movie="文件名.mp4"就行,不用加音频流的声明 - 音频拼接的部分要对应所有带音频的文件数量,要是所有视频都没音频,直接删掉音频拼接的代码块就行
第三步:执行拼接命令
用FFmpeg调用刚才写的脚本,生成最终的拼接视频:
ffmpeg -filter_complex_script combine.txt -map "[final_out]" -c:v libx264 -c:a aac 最终输出.mp4
这样操作下来,不管视频有没有音频,都能稳定拼接成一个完整的文件啦~
备注:内容来源于stack exchange,提问作者Skeeve
相关产品推荐
相关产品推荐

