我的相机将 .mov 文件作为电影拍摄。我怎样才能从中删除所有元数据,这样我就可以放心地在 YouTube 上分享它们,而不会意外泄露它们的拍摄时间/地点、我的相机类型等。命令行单行程序很好,但如果太混乱,GUI 程序会更好。
答案1
好吧,我有一个命令行答案:
笔记:这只适用于ffmpeg
Ubuntu 默认包含的:它将有一个类似于的版本0.8.1-4:0.8.1-0ubuntu1
;它将不会可与您从第三方 PPA 安装或自行编译的任何 ffmpeg 二进制文件一起使用。您的情况可能会有所不同。
- 安装这些:
sudo apt-get install ffmpeg libimage-exiftool-perl
- 然后导航到源 .mov 文件所在的位置,我们将调用它
test.mov
然后运行:
ffmpeg -i test.mov -map_metadata -1 -vcodec 复制 -acodec 复制 test-nometadata.mov
然后您可以用它
exiftool
来检查它是否有效;exiftool test.mov
并且exiftool test-nometadata.mov
应该会向您显示差异。下面是我从旧的尼康 .mov 中输出的带有大量元数据(pastebin 格式)的示例:
- 之前 - 80 行元数据
- 之后 - 52 行元数据(甚至创建,修改等时间都已清空)
(请注意,上面 ffmpeg 中的顺序至关重要——必须在最后指定输入和输出文件)
答案2
笔记:使用最新版本的 ffmpeg(可能还有 avconv,但我还没有测试过),您可以简单地使用:
ffmpeg -i input.mp4 -map 0 -map_metadata -1 -c copy output.mp4
使用-map_metadata -1
会创建一个空的“虚拟”元数据源。对于存储库中的 avconv 版本或其他过时版本,请使用下面描述的方法。
使用 avconv(或者 ffmpeg,如果这是您选择的武器,语法是相同的):
最简单的方法是设置-map_metadata
为使用其中一个输入流,而不是使用全局元数据。99% 的时间这应该有效。
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% 的情况下都有效,所以应该是首选。
奖励:创建目录中每个 MP4 的空白版本,然后用空白版本替换元数据版本(警告-几乎不可逆):
for f in *.mp4; do avconv -i "$f" -map 0 -map_metadata 0:s:0 -c copy "out.$f"; mv "out.$f" "$f"; done