如何通过 FFmpeg 删除所有格式的所有元数据?
我可以为每种格式设置特殊的元数据手册: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
答案1
稍微修改一下@izx 的命令行, 我懂了:
ffmpeg -i in.mov -map_metadata -1 -c:v copy -c:a copy out.mov
结果是(再次使用 进行检查exiftool
),元数据记录从 81 行减少到 52 行。请注意,您不能简单地删除所有元数据,有些内容会保留下来。
如果要删除新添加的encoder
字段,请将其添加到命令中(在输出文件名之前):
-fflags +bitexact -flags:v +bitexact -flags:a +bitexact
感谢@wisbucky 的提示。
但是,我没有更改创建日期,这很奇怪,因为它似乎在 Ubuntu 版本中有效。我发布了FFmpeg 邮件列表,询问是否有任何最新消息或评论,但没有答复。
答案2
笔记:我已经更新了(之前我从 Ubuntu 存储库中ffmpeg
获取了过时的版本)。avconv
现在@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
这将从第一个数据流(通常是视频流)中获取元数据,并使用它来替换容器文件的全局元数据。这样做之所以有效,是因为大多数情况下,数据流中都没有写入有意义的元数据;但是,有时确实有,而您想完全删除该元数据。不幸的是,我能想到的唯一方法是使用管道和两个 avconv 进程。
avconv -i input.mp4 -f wav - | avconv -i - -i input.mp4 -map 1 -map_metadata 0 -c copy output.mp4
这利用了 WAV 文件不能包含元数据的事实(因为该格式是在元数据标签存在之前创建的)。
这两种方法都清空了我刚刚测试过的文件上的所有元数据 - 报告exiftool
的只是编解码器信息,而 avprobe 没有向我报告任何元数据。使用管道来做这件事相当丑陋,第一种方法在 99% 的情况下都有效,所以应该是首选。
答案3
我的解决方案是删除元数据、章节,更改创建时间和标题。这样,任何元内容都应该与原始文件不同:
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"
答案4
为了剥离元数据,我使用,-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"
选项-map 0:...?
参数意味着(根据man ffmpeg
):
流索引后面的尾随“?”将允许映射为可选:如果映射不匹配任何流,则映射将被忽略而不是失败。