ffmpeg - 如何从具有可靠/可重现结果的视频文件中剥离元数据?
问题描述
我正在尝试找到一种从各种媒体文件中生成“仅原始数据”的干净方法。我的意思是,获取一个文件,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 不是这项工作的好工具?如果不是这样,什么是好的选择?
解决方案
生成哈希
使用哈希复用器返回原始解码数据的哈希:
$ 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 -
视频和音频到单独的输出文件outvideo
和outaudio
:
ffmpeg -i input -map 0:v:0 -f rawvideo outvideo -map 0:a:0 -f s16le outaudio
推荐阅读
- javascript - 如何使用 p5.js 清除部分缓冲图像
- amazon-s3 - Generate index.html for AWS S3
- javascript - 按回车键输入 1 时防止提交表单
- python - 使用 numpy 数组的维度作为 if 语句 python
- ios - UITextView自动调整大小以调整单行iOS Objective -C
- sql - 在 SQL 中汇总行
- reactjs - 如何区分 React Redux 中的输入与按钮状态变化
- homebrew - 为 /usr/local/lib 酿造医生警告
- spring-security - Spring OAuth 1.0 在 POST 的请求正文中传递凭据
- qt - 组合框元素中的白色间距