将视频转换为帧,然后返回视频而不更改 python 中的帧

时间:2021-03-04 19:35:25

标签: python opencv ffmpeg

我正在用 python 编写一个脚本,将视频(让这个视频为 X)转换成帧(X′),然后再转换回同一个视频(< em>是)。现在,当我将视频 Y 分解回帧 (Y′) 时,图像不等于 X′ 帧,即它们具有不同的哈希值。我希望它们是相同的,如果不相同是预期的行为,我怎样才能使它们相同?

有什么办法可以去

`视频,X --> 帧,X′,--> 视频,Y,--> 帧,Y′、--> 视频、Z、--> 帧、Z′

等而不改变其先前状态的输出,例如视频 XYZ 和帧 X' Y′Z′在各自的集合中彼此相同吗?

我尝试了多种视频编解码器(mp4、avi、mkv)和图像格式(tif、jpeg、png)。据我所知,有损压缩编解码器不应该以无损方式工作,例如 tif 也不会产生一致的输出。

我已经按照这些 video-to-frameframe-to-video 以及其他教程进行了操作,但无济于事。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

这是由于 generation loss 和可能还有 colorspace 转换和 chroma-subsampling。您必须使用同样支持您的色彩空间(或“像素格式”)的无损工作流程。

示例:

  1. 输出无损图像格式:

    ffmpeg -i input.mp4 x_%02d.tiff
    

    使用 ffmpeg -h encoder=tiff 查看支持的像素格式列表。

  2. 使用 framehash muxer 获取帧哈希:

    ffmpeg -v error -i x_%02d.tiff -f framehash -hash md5 -
    #stream#, dts,        pts, duration,     size, hash
    0,          0,          0,        1,   230400, 56a4401ee8f46ef4205508ab06926bdc
    0,          1,          1,        1,   230400, 3ff51f5bef6dbf619fd0469bd29f63ec
    0,          2,          2,        1,   230400, ef51487b9905ecb4638c9901251a1dde
    
  3. 使用无损编码器编码视频:

    ffmpeg -framerate 25 -i x_%02d.tiff -c:v ffv1 video_y.mkv
    
  4. 输出无损图像格式:

    ffmpeg -i video_y.mkv y_%02d.tiff
    
  5. 获取帧哈希:

    ffmpeg -v error -i y_%02d.tiff -f framehash -hash md5 -
    #stream#, dts,        pts, duration,     size, hash
    0,          0,          0,        1,   230400, 56a4401ee8f46ef4205508ab06926bdc
    0,          1,          1,        1,   230400, 3ff51f5bef6dbf619fd0469bd29f63ec
    0,          2,          2,        1,   230400, ef51487b9905ecb4638c9901251a1dde
    

哈希匹配。

相关问题