首页 > 解决方案 > 如何从具有可靠/可重现结果的视频文件中剥离元数据?

问题描述

我正在尝试找到一种从各种媒体文件中生成“仅原始数据”的干净方法。我的意思是,获取一个文件,test.mp4并从其中剥离所有元数据/标题,这样我就可以生成实际视频数据的哈希值。

在对这个主题进行了大量挖掘之后, ffmpeg 似乎是我最好的选择,但是我发现执行元数据剥离的命令似乎会根据 ffmpeg 的版本产生不同的结果,这让我认为要么( a) 我的咒语有误,或者 (b) ffmpeg 实际上并没有只返回原始数据。

为了测试这一点,我使用jrottenberg 的 ffmpeg Docker 容器跨多个 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  -

所以我的问题是:有没有更可靠的方法来做到这一点?我只是错过了 ffmpeg 的选项吗?我在这里遗漏了什么,还是 ffpeg 不是这项工作的好工具?如果不是这样,什么好的选择?

标签: ffmpegmetadatamp4

解决方案


生成哈希

使用哈希复用器返回原始解码数据的哈希:

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

使用该-map选项选择所需的流。

仅生成第一个音频流的哈希并输出 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 -

视频和音频到单独的输出文件outvideooutaudio

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

推荐阅读