我正在使用 FFmpeg 将一些视频转码并缩小为 AV1,使用scale
过滤器和 AMD 的硬件编码器(在 FFmpeg 中以 av1_amf 的形式提供)。通常情况下,它工作正常,但现在我遇到了一个视频,应用scale
过滤器会在视频的底部/右侧添加黑色像素的行/列。
我的测试视频是 854x480,内容从 4:3 变成 16:9,我试图裁剪黑条并将其缩放到 360 的高度。使用-filter:v "crop=640:480,scale=-1:360"
,转码期间输出报告为 480x360:
Stream #0:0(und): Video: av1 (AV01 / 0x31305641), yuv420p(tv, progressive), 480x360 [SAR 1:1 DAR 4:3], q=2-31, 2000 kb/s, 23.98 fps, 1k tbn (default)
但生成的文件上的 FFprobe 显示它现在是 512x362,并且现在有行和列的黑色像素填充框架的底部和右侧:
Stream #0:0: Video: av1 (Main), yuv420p(tv, bt709, progressive), 512x362, SAR 1:1 DAR 256:181, 23.98 fps, 23.98 tbr, 1k tbn (default)
即使我在末尾添加了额外的裁剪滤镜,结果也完全相同"crop=640:480,scale=-1:360,crop=480:360:0:0"
:视频在转码期间报告为 480x360,但最终为 512x362。我似乎无法摆脱scale
添加的填充。
将问题简化为scale
过滤器,我尝试了只使用 的过滤器scale=-1:360
。这失败了,显示“向编码器提交视频帧时出错” - 这可能表明输入视频存在问题,但“未知错误”并没有给我太多线索。无论如何,我指定了 ,scale=640:360
并且成功了。在转码过程中,输出报告为 640x360:
Stream #0:0(und): Video: av1 (AV01 / 0x31305641), yuv420p(tv, progressive), 640x360 [SAR 1281:1280 DAR 427:240], q=2-31, 2000 kb/s, 23.98 fps, 1k tbn (default)
但随后使用 FFprobe 检查,尺寸报告为 640x362,并且现在有 2 行黑色像素填充框架底部:
Stream #0:0: Video: av1 (Main), yuv420p(tv, bt709, progressive), 640x362, SAR 1281:1280 DAR 1281:724, 23.98 fps, 23.98 tbr, 1k tbn (default)
如果我将过滤器设置为什么也不做scale=0:0
,这会将视频缩放到其原始尺寸,在转码期间它会被报告为 854x480:
Stream #0:0(und): Video: av1 (AV01 / 0x31305641), yuv420p(progressive), 854x480 [SAR 1:1 DAR 427:240], q=2-31, 2000 kb/s, 23.98 fps, 1k tbn (default)
但是 FFprobe 说它现在是 896x480,并且现在有 42 列黑色像素填充框架的右侧:
Stream #0:0: Video: av1 (Main), yuv420p(tv, bt709, progressive), 896x480, SAR 1:1 DAR 28:15, 23.98 fps, 23.98 tbr, 1k tbn (default)
使用其他编码器(如 x264 或 libsvtav1)时不会出现此问题。但这是我第一次看到 av1_amf 出现此问题。这可能是什么原因造成的?