将视频转换为帧,然后在不改变 python 中的帧的情况下返回视频

Covert video to frames, then back to video without altering the frames in python

我正在 python 中编写脚本,将视频(假设此视频为 X)转换为帧(X′) 然后回到同一视频 (Y)。现在,当我将视频 Y 拆分回帧 (Y′) 时,图像不等于 X′ 帧,即它们具有不同的哈希值。我希望它们是相同的,如果不相同是预期的行为,我怎样才能使它们相同?

有没有办法从

`video, X --> frames, X′, --> video, Y, --> 帧, Y′, --> 视频, Z, --> 帧, Z ′

等等,而不改变其先前状态的输出,例如视频 XYZ 和框架 X′, Y′, Z′ 彼此相同他们各自的集合?

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

我在其他教程中遵循了这些 video-to-frame and frame-to-video,但无济于事。任何帮助将不胜感激。

这是由于 generation loss and possibly also colorspace conversion and 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
    

哈希匹配。