FFmpeg PNG 帧提取实际上并不是无损的

FFmpeg PNG 帧提取实际上并不是无损的

编辑:事实证明这不是与 FFmpeg 相关的问题。罪魁祸首是 VLC,它没有准确地向我显示视频。特别是,VLC 有某种增强过滤器,只有在调整视频大小(例如使用“始终适合窗口”选项)时才会启用。此过滤器的作用是去除原始文件中一直存在的带状伪影。

人们有理由认为使用 FFmpeg 将视频帧提取为单独的 PNG 文件会产生无损结果。但最近我惊恐地发现事实并非如此。提取的帧有非常明显的带状伪影,而原始视频中没有。我尝试了许多不同版本的 ffmpeg,有旧的也有新的,但这个问题似乎总是发生。

我在此附上我制作的一个示例视频,其中包含一个简单的循环渐变,我看不到任何瑕疵。我建议使用 VLC 观看视频,因为我尝试过的所有其他播放器(如 ffplay 和 MPC-HC)都会在渲染时出现明显的瑕疵。

https://gofile.io/d/PGQjUy

(如果链接失效请告知我)

这是使用此命令提取第 3 帧的结果:ffmpeg -i sample-yuv420p-video.mkv -vf "select=eq(n,3)" "PNG_defaultrange_defaultfmt_%%03d.png"

存在带状伪影

这是我尝试过的所有其他参数组合,带状伪影略有变化但从未消失:

ffmpeg -i sample-yuv420p-video.mkv -vf "select=eq(n\,3)" "PNG_defaultrange_defaultfmt_%%03d.png"
ffmpeg -i sample-yuv420p-video.mkv -vf "select=eq(n\,3)" -pix_fmt rgb24 "PNG_defaultrange_rgb24_%%03d.png"
ffmpeg -i sample-yuv420p-video.mkv -vf "select=eq(n\,3)" -pix_fmt rgb48be "PNG_defaultrange_rgb48be_%%03d.png"
ffmpeg -i sample-yuv420p-video.mkv -vf "select=eq(n\,3)" -sws_flags +accurate_rnd+full_chroma_int "PNG_full_defaultfmt_%%03d.png"
ffmpeg -i sample-yuv420p-video.mkv -vf "select=eq(n\,3)" -sws_flags +accurate_rnd+full_chroma_int -pix_fmt rgb24 "PNG_full_rgb24_%%03d.png"
ffmpeg -i sample-yuv420p-video.mkv -vf "select=eq(n\,3)" -sws_flags +accurate_rnd+full_chroma_int -pix_fmt rgb48be "PNG_full_rgb48be_%%03d.png"
ffmpeg -i sample-yuv420p-video.mkv -vf "select=eq(n\,3)" -src_range 0 -dst_range 0 -sws_flags +accurate_rnd+full_chroma_int -pix_fmt rgb48be "PNG_full2_rgb48be_%%03d.png"
ffmpeg -i sample-yuv420p-video.mkv -vf "select=eq(n\,3)" -src_range 1 -dst_range 0 -sws_flags +accurate_rnd+full_chroma_int -pix_fmt rgb48be "PNG_full3_rgb48be_%%03d.png"
ffmpeg -i sample-yuv420p-video.mkv -vf "select=eq(n\,3)" -src_range 0 -dst_range 1 -sws_flags +accurate_rnd+full_chroma_int -pix_fmt rgb48be "PNG_full4_rgb48be_%%03d.png"
ffmpeg -i sample-yuv420p-video.mkv -vf "select=eq(n\,3)" -src_range 1 -dst_range 1 -sws_flags +accurate_rnd+full_chroma_int -pix_fmt rgb48be "PNG_full5_rgb48be_%%03d.png"

我希望这只是我尝试的参数组合运气不好的一个例子。简而言之,是否有任何参数组合可以产生无损 PNG 输出?

答案1

为什么?
原因很简单:要从视频中提取无损图像,您应该使用 RAW 视频作为源。

在任何其他格式中,您都有一种或另一种压缩方案。您看不到它,因为视频是动态图像,您有 24、25、30 FPS,这可以平滑(减轻)压缩的影响(小缺陷、数字噪音等)。

相关内容