如何从具有 reliable/reproducable 结果的视频文件中去除元数据?

How to strip metadata from a video file with reliable/reproducable results?

我正在尝试找到一种从各种媒体文件中生成 "just the raw data" 的简洁方法。我的意思是,获取一个文件,test.mp4 并去掉所有 metadata/headers,这样我就可以生成实际视频数据的哈希值。

在对这个主题进行了大量挖掘之后,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  -

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

生成哈希

使用hash muxer到return原始解码数据的散列:

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

使用 -map option 到 select 所需的流。

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

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

元数据不会影响 returned 散列(除非您考虑专辑艺术元数据,您的 MP3 包含它,并且您的 ffmpeg 命令不排除它)。

原始数据

Barring simply using the SHA256 hash instead, is there a way to get the raw data rather than just a hash of it?

可以输出原始视频:

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