如何从具有 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 -
视频和音频到单独的输出文件 outvideo
和 outaudio
:
ffmpeg -i input -map 0:v:0 -f rawvideo outvideo -map 0:a:0 -f s16le outaudio
我正在尝试找到一种从各种媒体文件中生成 "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 -
视频和音频到单独的输出文件 outvideo
和 outaudio
:
ffmpeg -i input -map 0:v:0 -f rawvideo outvideo -map 0:a:0 -f s16le outaudio