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