如何仅创建没有元数据的媒体数据的校验和,以获得媒体文件的稳定标识。最好是跨平台方法,其库支持多种格式。例如 vlc、ffmpeg 或 mplayer。
(媒体文件应该是通用格式的音频和视频,图片也可以)
我不知道有任何现有的独立于平台的软件可以实现这一点,但我知道一种可以用解释(平台独立)语言(如 Java)实现这一点的方法。
本质上,我们只需要从文件中剥离任何元数据(标签),预先解复用视频文件。从理论上讲,在 demux 和删除元数据之后,可以对文件进行哈希处理并与另一个经过相同过程的文件进行比较,以匹配相同的文件,尽管标签不同。与指纹不同,这不会识别相似的歌曲/电影,而是识别相同的文件(假设您可能想要已存档的给定歌曲的 10 个不同版本或比特率,但不希望它们中的任何一个浮动的 2 个相同副本) .
其中最令人不安的部分是删除标签,因为标签格式有许多不同的规范,它们不一定在不同的应用程序中实现相同,即通过两个不同的应用程序分别给出相同标签的相同确切音频文件可能不会导致相同的输出文件. 这可能对纯音频校验和的概念造成致命问题的唯一方法是,流行的标记软件是否对文件的二进制音频部分进行了任何更改,或者以非标准方式填充音频。
进行校验和是微不足道的,但我不知道任何平台独立库都可以对 mpeg 文件进行 demux 和 detag 处理。我知道在 'nix 环境中,mpgtx 是一个很棒的命令行工具,可以执行 demux 和 detag,但显然这不是一个独立于平台的解决方案。
也许有人在那里感到雄心勃勃?
好吧,答案可能为时已晚 11 年,但万一像我这样的其他人偶然发现这个......
ffmpeg
可以输出单个流的校验和。因此,相同的音频或视频将独立于其容器格式或元数据输出相同的校验和。
文件的视频轨道示例$filename
,将输出写入$filename.md5
:
ffmpeg -i "$filename" -map 0:v -codec copy -f md5 "$filename.md5"
对于音频,使用-map 0:a
.
要输出到 STDOUT,请使用-
. 例如:
ffmpeg -i "$filename" -map 0:a -codec copy -hide_banner -loglevel warning -f md5 -
我发现的一种可能的解决方案似乎是使用 vlc:
./VLC -I rc snd.mp3 :sout='#std{mux=raw,access=file,dst=-}' vlc://quit | sha1sum