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

时间:2017-09-11 15:33:12

标签: video ffmpeg rgb yuv

我使用zeranoe页面的ffmpeg-3.2.4-win32,static和dev版本来解码我用x264编码器创建的一些h264 mp4视频。视频有很多静态区域,2d视频游戏类型。

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

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

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

https://regex101.com/r/V0lesF/1

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的命令行是:

Df_01a <- read.table(text="Name re1 re2 re3 parameter a 144 39.7 0.012 fed b 223 31.2 5 fed c 304 6.53 100 fed d 187 51.3 25 fed e 110 2.94 100 fed f 151 4.23 75 fed g 127 36.7 0.012 fed",header=T,stringsAsFactors=F) Df_01b <- read.table(text="Name re1 re2 re3 parameter a 142 39.3 0.042 feh b 221 31.0 4 feh c 301 6.13 90 feh d 185 41.3 15 feh e 107 2.44 940 feh f 143 2.23 75 feh g 121 31.7 0.012 feh",header=T,stringsAsFactors=F) Df_02 <- read.table(text="parameter c1 c2 c3 1 fed 5 4 3 2 feh 3 4 2 3 fea 5 4 3 4 few 2 4 3",header=T,stringsAsFactors=F)

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

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

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

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

1 个答案:

答案 0 :(得分:3)

在做了更多测试后,我已将问题缩小到YUV - &gt; 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:

/etc/cron.daily

或者在ffmpeg API sws_getContext()中标记:

-sws_flags full_chroma_int+accurate_rnd

使用这些,RGB输出就可以了。