将 4:4:4 YUV 视频下采样为 4:2:2?

将 4:4:4 YUV 视频下采样为 4:2:2?

我正在尝试将 FFMPEG 中的 YUV 原始视频从 444 降采样到 422 采样,但问题是输出文件仍然是 444?!帧速率和大小都正确。这是我最近的代码:

ffmpeg -s:v 3840x2160 -r 50 -i input.yuv -vf scale=3840:2160 -c:v rawvideo -pixel_format yuv422p10le output.yuv

答案1

这有点令人困惑:-pixel_format应用输入并-pix_fmt应用输出,但也可以用作 的快捷方式-pixel_format

假设的像素格式input.yuvyuv444p10le,使用以下命令:

ffmpeg -s:v 3840x2160 -pixel_format yuv444p10le -i input.yuv -c:v rawvideo -pix_fmt yuv422p10le output.yuv


测试:

  • input.yuv使用 100 帧 384x216像素格式构建yuv444p10le
    ffmpeg -y -f lavfi -i testsrc=size=384x216:rate=1:duration=100 -c:v rawvideo -pix_fmt yuv444p10le input.yuv
    文件大小为 384*216*100*3*2 = 49,766,400 字节(100 帧、3 个颜色通道和每个组件 2 个字节)。

  • 将像素格式转换为yuv422p10le
    ffmpeg -y -s:v 384x216 -pixel_format yuv444p10le -i input.yuv -c:v rawvideo -pix_fmt yuv422p10le output.yuv
    文件大小为 384*216*100*2*2 = 33,177,600 字节(100 帧,其中 Y 每分量有 2 个字节,U、V 每 2 个分量有 2 个字节)。

为了测试,我们可以使用 FFplayinput.yuv进行游戏output.yuv
ffplay -framerate 1 -video_size 384x216 -pixel_format yuv444p10le -i input.yuv
ffplay -framerate 1 -video_size 384x216 -pixel_format yuv422p10le -i output.yuv


关于过滤器的说明scale

默认情况下使用scale过滤器,结果与不使用过滤器相同(FFmpeg 内部使用比例过滤器将 yuv444 转换为 yuv422):

ffmpeg -y -s:v 384x216 -pixel_format yuv444p10le -i input.yuv -vf scale=dst_format=yuv422p10le -c:v rawvideo -pix_fmt yuv422p10le output2.yuv给出与之前相同的输出。

但是使用scale过滤器,我们可以有更多的控制权——例如,我们可以选择插值方法:

ffmpeg -y -s:v 384x216 -pixel_format yuv444p10le -i input.yuv -vf scale=sws_flags=lanczos:dst_format=yuv422p10le -c:v rawvideo -pix_fmt yuv422p10le output2.yuv

相关内容