我有几个不同纵横比的视频。
我使用此命令将它们全部放在 1920x1080p 帧内:
ffmpeg -i input -vcodec libx264 -s 1920x1080 -r 30 -strict experimental output
这很有效,所有视频在 1080p 分辨率下保持其纵横比。
完成之后,我将它们与此连接起来,我看到了两个意想不到的行为:
ffmpeg -f concat -safe 0 -i videolist.txt -vcodec libx264 -s 1920x1080 -r 30 -strict experimental -c copy 1080p_merged\output.mp4
首先,垂直视频被水平拉伸,即使它们已经在 1920x1080p 帧中,同时保持其纵横比。这怎么可能?
其次,我看到帧速率从我在每个实例中设置的 30fps(原始视频也有 30fps,到 29.95 或 29.81 或其他内容)下降。
我究竟做错了什么?
该选项
-s 1920x1080
没有定义将这些视频放入的“帧边界”。它定义了输出视频的分辨率,并且间接地,输出视频的预期宽高比为 16:9。当您合并具有某些不同纵横比的视频时,它们将被拉伸以达到相同的纵横比。
为了防止这种情况,您可以在将输入视频缩放为 1920x1080 之前,以 16:9 以外的宽高比向输入视频添加一些填充(水平或垂直黑条)。
以下是一些如何添加此类黑条的示例。
奇怪的纵横比的原因与 SAR- Sample Aspect Ratio有关。
通常 SAR 是 1:1,应用方形像素。
非 1:1 的 SAR 值适用于非平方像素。
您的第一个命令修改了 SAR 属性,这就是奇怪结果的原因。
让我们从构建几个合成视频样本开始:
使用您的命令将分辨率转换为 1920x1080:
查询
width
,height
和使用SAR
FFprobe :DAR
FF探针输出:
如您所见,输入视频
1:1
的 SAR 是,但输出视频的 SAR 受原始输入视频分辨率的影响。1:1
SAR 不会导致奇怪的纵横比问题的事实。注意:我不知道为什么FFmpeg默认修改SAR,但它是这样工作的。
为了解决它,您可以使用
scale
带有过滤器的过滤器,setsar
如下所述:FF探针输出:
现在 SAR 是
1:1
,DAR 是16:9
。您可以连接上述文件,而无需修改纵横比。
修复 FPS:
平均 FPS 是一个估计值,不准确的原因不止一个。
很难说出现细微误差的原因。
根据 concat demuxer文档:
我们可以尝试用
-r 30
fps过滤器替换(设置时基,并修复时间以防万一……):我不确定它是否会解决 FPS 问题。
注意:
准备输入文件然后重新编码不是最好的解决方案,因为您将视频重新编码两次,并且质量下降。
我建议您使用concat filter,而不是 concat demuxer,并在一个命令中完成所有操作(以防它不太困难)。