在sws_scale()中将ffmpeg的YUV转换为RGB不好(以前是:ffmpeg块状色度解码)

noi*_*per 2 video rgb ffmpeg yuv

我正在使用zeranoe页面上的ffmpeg-3.2.4-win32(静态和dev版本)解码我使用x264编码器创建的一些h264 mp4视频。这些视频具有很多静态区域,即2d电子游戏类型。

当我使用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,但是发生了同样的事情。

noi*_*per 5

经过更多测试之后,我将问题范围缩小到了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 Bugtrack中找到了修复程序

为了执行高质量的YUV到RGB转换,您必须添加ffmpeg.exe:

-sws_flags full_chroma_int+accurate_rnd

或在ffmpeg API sws_getContext()中,标记为:

SWS_FULL_CHR_H_INT | SWS_ACCURATE_RND

有了这些,RGB输出就可以了。