【问题标题】:ffmpeg poor YUV to RGB in sws_scale() (was: ffmpeg blocky chroma decoding)sws_scale() 中的 ffmpeg 差 YUV 到 RGB(原为:ffmpeg 块状色度解码)
【发布时间】:2018-02-19 21:49:10
【问题描述】:

我正在使用来自 zeranoe 页面的 ffmpeg-3.2.4-win32、静态和开发版本来解码我使用 x264 编码器创建的一些 h264 mp4 视频。视频有很多静态区域,二维视频游戏类型。

当我使用 ffmpeg.exe 或 avcodec_decode_video2() API 函数解码它们的帧时,我的色度分辨率很差,在视频的静态区域中非常明显(编辑:avcodec_decode_video2() 返回正确的 YUV,问题是 YUV->RGB 转换,请参阅下面我自己的答案)

使用 ffmpeg.exe,只有当我将帧输出到 png 时,我才会得到较差的色度,但如果我将它们输出到 jpg,色度似乎要好得多 (编辑:这是由于 ffmpeg 的 sws_scale 的 YUV 到 RGB 转换不佳()).

这里是从使用静态图像创建的 mp4 视频中获得的相同帧的示例,输出帧被放大以清楚地看到效果。

https://drive.google.com/file/d/0B5KI1D-N1kHpV3lGaERJRjNkcms/view

1:压缩前的原始帧。

2:压缩前的YUV 4:2:0转换

3:MPC HC + LAV 解码器的视频输出。这是 YUV 解码后的输出。

4:用ffmpeg.exe解码成jpeg的视频帧,质量基本还可以,只是看到了一些jpeg宏块。

5: 用 ffmpeg.exe 解码为 png 的视频帧,非常块状的色度。这是 RGB 输出,使用 avcodec_decode_video2() 和 sws_scale() 转换为 RGB 会产生相同的块状色度。


将帧解码为 jpg 和 png 的命令行如下:

ffmpeg -i testcase.mp4 -vframes 5 -qscale:v 2 output%03d.jpg

ffmpeg -i testcase.mp4 -vframes 5 output%03d.png

您可以在此处下载展示效果的 mp4 和 bat 文件:

https://drive.google.com/drive/folders/0B5KI1D-N1kHpcUdGd2IyM2pXMTg


我尝试过使用 ffmpeg 3.2,但同样的事情发生了。

【问题讨论】:

    标签: video ffmpeg rgb yuv


    【解决方案1】:

    在做了更多测试后,我将问题缩小到了 YUV -> sws_scale() 的 RGB 转换。

    我的第一个解释是错误的,因为 ffmpeg avcodec_decode_video2() 的 YUV 输出是可以的,这就是为什么外部播放器、ffplay 和 jpeg 输出也可以的原因。 RGB 输出有什么问题。

    对于使用 sws_scale() 的 YUV 到 RGB,我尝试了目标格式 AV_PIX_FMT_RGB24 和 AV_PIX_FMT_BGRA 并尝试了标志 SWS_BILINEAR、SWS_FAST_BILINEAR、SWS_POINT,但结果相同。

    修复:

    好的,我在 https://trac.ffmpeg.org/ticket/1582 的旧 ffmpeg 错误跟踪中找到了修复程序

    为了进行高质量的 YUV 到 RGB 的转换,你必须在 ffmpeg.exe 中添加:

    -sws_flags full_chroma_int+accurate_rnd

    或者在 ffmpeg API sws_getContext() 中的标志:

    SWS_FULL_CHR_H_INT | SWS_ACCURATE_RND

    有了这些,RGB输出就OK了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 2021-05-28
      • 2021-11-25
      • 2017-04-21
      • 2012-01-19
      相关资源
      最近更新 更多