FFmpeg通过filter_complex拼接不同起始时间音视频时输出过长问题
问题原因
你的问题出在 concat滤镜的使用逻辑和需求不匹配:concat滤镜的作用是将多个视频流按输入顺序首尾拼接,前一个流播放完毕后才会加载下一个流。你给每个视频添加PTS时间偏移后再执行拼接,相当于将所有视频的偏移量、自身时长全部累加,最终总时长自然会远超预期。
解决方案
你需要的是按各自设定的起始时间点播放视频,无视频时段默认显示黑底,该需求可以通过串联多个overlay滤镜实现:overlay支持多次嵌套串联,没有输入数量限制。
修改后的完整命令如下(可根据实际情况调整分辨率、帧率、最大时长参数):
ffmpeg -i audio_1.flv -i audio_2.flv -i audio_3.flv -i audio_4.flv -i audio_5.flv -i video_1.flv -i video_2.flv -i video_3.flv -i video_4.flv -filter_complex \ "[0]adelay=9761[audio0];[1]adelay=183387[audio1];[2]adelay=694634[audio2];[3]adelay=740306[audio3];[4]adelay=775587[audio4];[audio0][audio1][audio2][audio3][audio4]amix=5[audios];\ color=c=black:s=1920x1080:r=25:d=1000[bg];\ [5:v]setpts=PTS-STARTPTS+30.236/TB,tpad=stop_mode=add:stop_duration=1000[v0];\ [6:v]setpts=PTS-STARTPTS+201.314/TB,tpad=stop_mode=add:stop_duration=1000[v1];\ [7:v]setpts=PTS-STARTPTS+702.615/TB,tpad=stop_mode=add:stop_duration=1000[v2];\ [8:v]setpts=PTS-STARTPTS+921.682/TB,tpad=stop_mode=add:stop_duration=1000[v3];\ [bg][v0]overlay=eof_action=pass[bg1];\ [bg1][v1]overlay=eof_action=pass[bg2];\ [bg2][v2]overlay=eof_action=pass[bg3];\ [bg3][v3]overlay=eof_action=pass[videos]" \ -map [videos] -map [audios] -c:v h264 -c:a aac -shortest output.mp4
参数说明
color滤镜用于生成黑底背景画布:s参数修改为你需要的输出分辨率,r参数修改为和源视频一致的帧率,d参数修改为你预期的最大总时长即可tpad滤镜用于给每个视频结束后补充透明帧,避免视频播放完毕后最后一帧一直停留在画布上overlay的eof_action=pass参数表示当前叠加的视频流结束后,继续保留底层画布的内容- 末尾的
-shortest参数会让最终输出时长自动对齐所有流中最长的那个的结束时间,避免背景多余的空白时长
该方案可以解决你遇到的时长异常、重复帧报错问题,不需要额外添加-vsync 2参数。
内容的提问来源于stack exchange,提问作者DummyBeginner
相关产品推荐
相关产品推荐

