![FFmpeg 串联删除第一个视频的一部分](https://linux22.com/image/1535977/FFmpeg%20%E4%B8%B2%E8%81%94%E5%88%A0%E9%99%A4%E7%AC%AC%E4%B8%80%E4%B8%AA%E8%A7%86%E9%A2%91%E7%9A%84%E4%B8%80%E9%83%A8%E5%88%86.png)
我用ffmpeg.exe
它来连接两个视频。第一个视频本质上是一个 5 秒的介绍,以 1080p 每秒 25 帧的速度渲染,并且它将始终保持相同的格式。第二个视频是一个随机视频,可以是任何长度和格式,但将是一个 MP4 文件 (h264)。这个特定的测试用例恰好是一个分辨率为 400x240 、帧率为 30fps 的视频。
因此,我制作了一个 5 秒的 1080p25 介绍视频,并将其与 240p30 视频连接起来。由于它们都是 MP4 文件,我首先mpegts
使用以下命令将它们转码为一个文件:
ffmpeg -y -i intro.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intro.mp4.ts
ffmpeg -y -i video.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts video.mp4.ts
现在这两个文件已转换为可合并格式,我运行以下命令对要合并的两个视频进行编码:
ffmpeg -y -i "concat:intro.mp4.ts|video.mp4.ts" -c:v libx264 -preset ultrafast -crf 20 -vf fps=60 -b:v 8M -minrate 8M -maxrate 12M -bufsize -8M -c:a aac -b:a 256k output.mp4
这几乎按预期工作,但有一件事不断发生:当编码到达 5 秒标记(介绍的结束或实际视频的开头)时,它会显示此警告:DTS 126000 < 619200 out of order
其余转换过程运行良好。但是,当我播放输出文件时,会播放简介,然后在简介的最后跳转到下一个视频的开头。有些视频播放器会跳过这个间隙。其他播放器会播放简介的其余部分,但该特定区域没有声音,这让我相信这是一个音频问题。
由于文件的其余部分播放正常,我尝试了设置,并惊讶地发现,当我将 x264 预设从 更改为ultrafast
或medium
时slow
,问题变得更糟:跳过会在简介中较早发生,但实际视频不受影响。 在哪里ultrafast
会导致跳过省略最后半秒的视频/音频,medium
会导致一秒到一秒半,并slow
会在两秒内切断。
是什么原因造成的?我该如何解决这个问题?我读过一些建议,建议在连接之前重新编码两个视频,但如果可能的话,我想避免这样做,因为介绍每次都会保持不变。如果这是唯一的解决方案,有没有办法通过一次调用 FFmpeg 来完成所有这些操作?该工具由我正在编写的 C# 程序调用。
答案1
您可以使用以下建议这个答案如果需要的话缩放视频:
ffmpeg -y -i intro.mp4 -i video.mp4 -filter_complex "\
[0:v:0]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2[v0]; \
[1:v:0]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2[v1]; \
[v0][0:a:0][v1][1:a:0]concat=n=2:v=1:a=1[v][a] \
" -map "[v]" -map "[a]" output.mp4
请注意,我已将此应用于所有输入,但您当然可以选择性地对您知道与输出大小不同的输入执行此操作。 如果 SAR 不同,您可以setsar
在之后使用过滤器pad
,但我认为这不是绝对必要的:
[0:v:0]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=sar=1[v0]