代码之家  ›  专栏  ›  技术社区  ›  Daniel Quinn

如何从具有可靠/可复制结果的视频文件中剥离元数据?

  •  0
  • Daniel Quinn  · 技术社区  · 8 年前

    我正试图找到一种从各种媒体文件中生成“原始数据”的干净方法。我的意思是,拿个文件, test.mp4 然后去掉所有的元数据/头,这样我就可以生成实际视频数据的散列。

    在对这个主题进行了大量深入研究之后,ffmpeg似乎是我在这方面的最佳选择,但是我发现的执行元数据剥离的命令似乎 根据ffmpeg的版本产生不同的结果 ,这使我认为要么(a)我的咒语错了,要么(b)ffmpeg实际上不只是返回原始数据。

    为了测试这个,我用 jrottenberg's ffmpeg Docker containers 要跨多个ffmpeg版本创建同一文件的哈希,请执行以下操作:

    for tag in 4.0-centos 4.0-alpine 3.4-alpine 3.4-centos 3.0-alpine 3.0-centos; do
        docker pull jrottenberg/ffmpeg:${tag}
        docker run --rm \
          -v /data/:/data/ \
          -it jrottenberg/ffmpeg:${tag} \
          -i /data/test.mp3 \
          -map_metadata -1 -c:v copy -c:a copy \
          -f mp4 - | md5sum
    done
    

    结果是,这些实例中的每一个都有不同的哈希输出(为清晰起见,Docker输出被截断):

    d7e3577ffe65d73240f48842e8d42207  -
    da2bda81911d758c877aace6ed3c0025  -
    ed24948c1dedf5d53870dfcfe24c7c70  -
    3dbb89d812c26711a33ca670403ccc20  -
    a4533446d3225e755eb041167e32b279  -
    69a51d82acc9987eed8b517a748435eb  -
    

    所以我的问题是:有没有更可靠的方法来做到这一点?我是不是错过了一个选择?我是在这里找不到什么东西,还是说ffpeg不是这份工作的好工具?如果不是那样,怎么办? 一个好的选择?

    1 回复  |  直到 8 年前
        1
  •  1
  •   llogan    8 年前

    生成哈希

    使用 hash muxer 要返回原始解码数据的哈希:

    $ ffmpeg -loglevel error -i input.mp3 -f hash -f null -
    SHA256=727ef2f1a4317a97ddb9aa83e80b5d876986a92c67045317bffb6505e4de6617
    

    使用 -map option 选择所需的流。

    仅生成第一个音频流的哈希并输出MD5哈希的示例:

    $ ffmpeg -loglevel error -i input.foo -map 0:a:0 -f hash -hash MD5 -
    MD5=616beb5bf16504caf37aacf0d0e99731
    

    元数据不会影响返回的散列(除非考虑唱片集艺术元数据,MP3包含它,并且ffmpeg命令不排除它)。

    原始数据

    除非只使用sha256散列,有没有一种方法可以获得原始数据,而不仅仅是散列数据?

    您可以输出原始视频:

    ffmpeg -i input -f rawvideo output
    

    或者用管道输送:

    ffmpeg -i input -f rawvideo -
    

    将视频和音频同时转换为单独的输出文件 outvideo outaudio :

    ffmpeg -i input -map 0:v:0 -f rawvideo outvideo -map 0:a:0 -f s16le outaudio