使用 FFmpeg 从所有格式中剥离元数据

swe*_*web 57 metadata ffmpeg

如何通过 FFmpeg 从所有格式中删除所有元数据?

我可以为每个man ffmpeg 的每个格式设置特殊的元数据。任何清除所有元数据并从 ffmpeg 上可用的所有元数据中剥离媒体的选项或方法?

   -metadata key=value
       Set a metadata key/value pair.

       For example, for setting the title in the output file:

               ffmpeg -i in.avi -metadata title="my title" out.flv
Run Code Online (Sandbox Code Playgroud)

slh*_*hck 81

通过 @izx稍微修改命令行,我得到了这个:

ffmpeg -i in.mov -map_metadata -1 -c:v copy -c:a copy out.mov
Run Code Online (Sandbox Code Playgroud)

结果是(再次检查exiftool),元数据记录从 81 行减少到 52 行。请注意,您不能简单地删除所有元数据,有些内容会保留下来。

如果要删除新添加的encoder字段,请将其添加到命令中(在输出文件名之前):

-fflags +bitexact -flags:v +bitexact -flags:a +bitexact
Run Code Online (Sandbox Code Playgroud)

感谢@wisbucky 的提示。

但是,我没有更改创建日期,这很奇怪,因为它似乎在 Ubuntu 版本中有效。我在FFmpeg 邮件列表上发帖,询问是否有任何更新或评论,但没有答案。

  • @Rookie 然后你需要设置`-metadata title="Some Value"`。或者,对于文件,对于 MP4 文件是这样的:`ffmpeg -i "$file" -map_metadata -1 -c copy -metadata title="$file" "${file%%*.mp4}-new。 mp4` (4认同)
  • 使用当前的 ffmpeg,可以使用 `-metadata creation_time=2012-12-17T21:30:00` (UTC) 更改创建时间。 (3认同)
  • 在 `mov` 或 `mp4` 文件中,创建日期是电影标题和轨道标题中的一个整数字段(表示为自 1904 年以来的秒数)。尽管您可以将其设置为 0 或其他一些固定值,但无法删除它并且仍然具有有效的 `mov` 或 `mp4` 文件。 (2认同)

shu*_*hub 11

我的解决方案是剥离元数据、章节,以更改创建时间和标题。这样任何元内容都应该与原始文件不同:

ffmpeg -y -i "test.mkv" -c copy -map_metadata -1 -metadata title="My Title" -metadata creation_time=2016-09-20T21:30:00 -map_chapters -1 "test.mkv"
Run Code Online (Sandbox Code Playgroud)

  • 该变体对我很有用,谢谢。我希望 ffmpeg 手册能显示更多像上面这样的例子;stackoverflow、超级用户等……都变得非常有用,因为它们包含了很多有用的信息。 (2认同)

evi*_*oup 10

注意:我已经更新了ffmpeg(以前我avconv从 Ubuntu 存储库中获得了过时的版本)。

现在@slhck-map_metadata -1 完美运行。

我推荐@slhck 的解决方案,因为它的输入更少并且是最新的。我把这个留在这里给任何使用过时版本的人。


最简单的方法是设置-map_metadata使用输入流之一,而不是使用全局元数据。99% 的时间这应该有效。注意:我正在使用 avconv,因为它在 Ubuntu 12.04 存储库中;这可能与 ffmpeg 兼容,因为它们的语法始终符合我的经验。

avconv -i input.mp4 -map 0 -map_metadata 0:s:0 -c copy output.mp4
Run Code Online (Sandbox Code Playgroud)

这将从第一个数据流(通常是视频流)中获取元数据,并使用它来替换容器文件的全局元数据。这是有效的,因为大多数时候,数据流没有写入有意义的元数据;然而,有时他们会这样做,并且您希望完全摆脱该元数据。不幸的是,我能想到的唯一方法是使用管道和两个 avconv 进程。

avconv -i input.mp4 -f wav - | avconv -i - -i input.mp4 -map 1 -map_metadata 0 -c copy output.mp4
Run Code Online (Sandbox Code Playgroud)

这利用了 WAV 文件不能包含元数据的事实(因为格式是在元数据标签存在之前创建的)。

这两种方法都exiftool清除了我刚刚测试过的文件上的所有元数据 - 所有报告的都是编解码器信息,而 avprobe 没有向我报告任何元数据。为此使用管道非常难看,第一种方法在 99% 的情况下都有效,因此应该首选。

  • WAVE 文件,与其他基于 RIFF 的文件(例如 AVI)一样,实际上可以使用“INFO”列表块包含元数据标签。它只是不经常使用。 (3认同)

Seb*_*bMa 6

为了剥离元数据,我使用-map_metadata:g -1,因为我只剥离全局元数据并保留字幕的元数据,例如轨道语言名称:

$ ffmpeg -hide_banner -i "$video" -map 0:v:0? -map 0:a? -map 0:s? -c copy -map_metadata:g -1 "$outputVideo"
Run Code Online (Sandbox Code Playgroud)

选项-map 0:...?参数意味着(根据man ffmpeg):

后面有一个“?” 流索引之后将允许映射是可选的:如果映射没有匹配任何流,则映射将被忽略而不是失败。