我在某个目录下的某个分层数据结构中存放了太多电影。我需要删除它们的所有属性/特性,因为其中一些包含错误信息,老实说,我不需要它。
通常,“手动”执行此操作(在 Windows 中)的方法是转到文件的“属性”,然后转到“详细信息”选项卡,单击底部的链接,然后创建一个删除属性的新副本,或者手动删除它们;如下图所示:
我知道如何循环遍历电影目录中的所有文件(在 Windows 和 Linux 中)。因此,我的问题是:给定 mkv/mp4 文件,是否有一个 Windows 或 Linux 命令提示符/终端命令可以删除这些属性?
我期望类似的东西:
mkvtoolnix --remove-all-attributes my-movie.mkv
答案1
你想到了吗ffmpeg
?这是一款处理视频文件的绝佳工具。看看吧这里看看它是否能实现你所寻找的。
ffmpeg -i in.mkv -map_metadata -1 -c:v copy -c:a copy out.mkv
这会删除元数据并将音频和视频流复制到新文件。
更新:
假设您有其他想要保留的流(例如字幕),命令变为(请注意,这将删除所有流的元数据):
ffmpeg -i in.mkv -map_metadata -1 -c copy -map 0 out.mkv
假设您只想隐藏一个或多个元数据,而不是全部:
ffmpeg -i in.mkv -metadata title='' -c copy -map 0 out.mkv
答案2
需要牢记的一点是,许多属性无法删除,包括标题之类的内容。
删除能被删除:
find . -iname \*.mkv -exec mkvpropedit "{}" --tags all: \+
将无法删除的不需要的东西设置为空的:
find . -iname \*.mkv -exec mkvpropedit "{}" -e info -s title="" \+
您将需要进行几次迭代,找出可以删除和不能删除的内容,然后创建一个您想要清空的内容列表,并将它们添加到第二个命令变体上...我还没有测试当有人试图将文件中当前不存在的属性设置为空时会发生什么。
答案3
setlocal enabledelayedexpansion
for %%a in ( "*.avi" "*.mkv" "*.mp4" ) do (
(ffmpeg -i "%%a" -map 0 -map_metadata -1 -c copy "1%%%a"))
但是,这里文件夹内的每个文件 .avi .mkv .mp4:
- 即使每个文件不包含标题/评论,也会对其进行处理。
- 原始文件保持不变,具有相同的名称和相同的元数据。
- 输出文件名以 1 开头,例如 myfile.mp4 将输出为 1myfile.mp4,因为这对我来说很方便 - 但是,您可以删除输出文件名前面的 1,如果您愿意的话,但希望收到每个文件的覆盖提示。
在我的设备上处理 1.5gb 的文件大约需要 8 秒。