video - ffmpeg 在 sws_scale() 中从 YUV 到 RGB 的效果较差(为 : ffmpeg blocky chroma decoding)

标签 video ffmpeg rgb yuv

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

当我使用 ffmpeg.exe 或 avcodec_decode_video2() API 函数解码其帧时,我的色度分辨率很差, block 状且在视频的静态区域中非常明显(编辑: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 宏 block 。

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


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

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

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

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

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


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

最佳答案

经过更多测试后,我将问题范围缩小到 sws_scale() 的 YUV -> 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,但结果相同。

修复:

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

为了进行高质量的 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了。

关于video - ffmpeg 在 sws_scale() 中从 YUV 到 RGB 的效果较差(为 : ffmpeg blocky chroma decoding),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46159322/

相关文章:

ffmpeg - 使用 libavcodec 将视频解码为 YUV422

video - 如何捕获YouTube视频的图像并在网站上显示

安卓 MediaCodec 解码器 : Slow Down Video Playback

带有 aevalsrc 的 ffmpeg complex_filter 导致 "Invalid stream specifier"

video - 用于将 HTML5 视频转换为 mp4 和 ogg 的 ffmpeg 设置

image - 如何平滑并去除白边?另外,为什么我的回答里会出现黑线呢?怎么解决呢?

ios下载视频暂停/继续

audio - ffmpeg 录制视频播放太快

c#-4.0 - 从视频c#中提取音频作为MP3文件

video - FFMPEG 将 RGBA 图像序列拆分为 rgb.mp4 和 alpha.mp4