使用 FFmpeg 提取帧会产生低分辨率颜色

使用 FFmpeg 提取帧会产生低分辨率颜色

我使用以下命令提取视频中的帧:
ffmpeg -i input.mkv -r 24000/1001 frame%08d.png
这有效,但是生成的帧的颜色分辨率明显较低,特别是在红色与其他颜色相遇的地方。下面是一个例子来说明我的意思。

视频在 MPC-HC 中的样子如下:
这是视频在 MPC-HC 中的样子。

这是 FFmpeg 提取的同一帧的样子:
这是 FFmpeg 提取的同一帧的样子。

如您所见,除了红色边缘缺乏分辨率外,红色的色调也不同。两张图片的分辨率相同(1920x1080),并且都是 PNG,因此这不是有损压缩的问题。我猜这要么是解码过程中的问题,要么是色彩空间转换过程中的问题,但我不确定如何告诉 FFmpeg 尽可能多地保留原始信息。

答案1

FFmpeg 从 yuv420p 转换为 rgb24 像素格式的方法,使用质量较低的插值方法。

我们可以通过使用以下方法将 yuv420p 转换为 yuv444p 来提高质量兰佐斯插值方法,然后从yuv444p转换为rgb24:

ffmpeg -i input.mkv -r 24000/1001 -vf "scale=sws_flags=lanczos:in_color_matrix=bt709,format=yuv444p" frame%08d.png


  • scale=sws_flags=lanczos在放大 U 和 V 色度通道时选择 Lanczos 插值方法(反转色度子采样)。
  • format=yuv444p强制将过滤器的输出格式scale设为yuv444p。PNG
    输出图像将隐式转换为 rgb24 格式。
  • in_color_matrix=bt709用于修复颜色不准确。

请注意,默认转换重采样sws_flags=neighbor(“最近邻”插值)速度更快,但质量较低。


结果:
在此处输入图片描述


注意:
我没有检查 MPC-HC 使用的确切插值方法。
与最近邻方法相比,所用方法是更高质量的插值。

相关内容