H.264

H.264

我正在尝试使用 ffmpeg 和 h.264 压缩一系列图像。

ffmpeg -f image2 -r 5 -i ori/binary%03d.jpg -vcodec libx264 -preset veryslow a.mp4
ffmpeg -i a.mp4 -q 2 rec/output_%03d.jpg

但输出图像仍然与原始图像不同。
生成无损视频并从中提取原始图像的正确方法是什么?

答案1

H.264

标准 H.264 是有损的,因此当您从 JPG > H.264 > JPG 时,您有两个几代人的损失。 使能够无损模式在 libx264 中添加-crf 0

 ffmpeg -framerate 5 -i ori/binary%03d.jpg -c:v libx264 -crf 0 -preset veryslow lossless.mp4

现在,您可以使用以下方法检查每帧解码后的哈希值:帧哈希多路复用器(muxer):

ffmpeg -v error -i lossless.mp4 -f framehash -
[...]
#stream#, dts,        pts, duration,     size, hash
0,          0,          0,        1,   230400, 2c3b4546159721bb2328a56bb520d15d45a4d6a845a31a3ac41ae2bbe27188d9
0,          1,          1,        1,   230400, 597803e630b0f50d0e703293367747d00798677950cf2b1398258335e8753ba8
0,          2,          2,        1,   230400, 64d37a10a1841126c9ad8804c0ec20ac89f102d737ffd787d9f963c4c3ea9bc1
[...]

与 JPG 输入进行比较:

ffmpeg -v error -i ori/binary%03d.jpg -f framehash -
[...]
#stream#, dts,        pts, duration,     size, hash
0,          0,          0,        1,   230400, 2c3b4546159721bb2328a56bb520d15d45a4d6a845a31a3ac41ae2bbe27188d9
0,          1,          1,        1,   230400, 597803e630b0f50d0e703293367747d00798677950cf2b1398258335e8753ba8
0,          2,          2,        1,   230400, 64d37a10a1841126c9ad8804c0ec20ac89f102d737ffd787d9f963c4c3ea9bc1
[...]

在这个例子中,哈希值相同,验证了无损转换。

即使使用无损 H.264,您也无法提取原始 JPG,但现在您可以输出为另一种无损图像格式。

请注意,由于色彩空间转换,PNG 输入的哈希值将不匹配。建议对 PNG 使用 libx265rgb:除非将 gbrp 转换为 rgb24,否则哈希值仍然不匹配。

图像处理

或者只是将 JPG 图像合并到视频中。可以将其视为复制和粘贴。它们只是按原样转储并一个接一个地播放:

ffmpeg -framerate 5 -i ori/binary%03d.jpg -c copy video.mkv

提取:

ffmpeg -i video.mkv -c copy output%04d.jpg

相关内容