【发布时间】: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,但同样的事情发生了。
【问题讨论】: