我在其他几个人中看过this post和this post。他们提供了一些关于如何开始的信息,不幸的是我的用例稍微复杂一些。
我有一对运行ffmpeg命令的视频文件。我运行的命令将元数据从原始文件传输到转换后的文件,如下所示:
christian$ ffmpeg -i file_1.mov -i file_1.mp4 -map 1 -map_metadata 0 -c copy file_1_fixed.mp4
This post解释了命令的作用,如果需要解释的话。基本上,用例是原始文件和转换后的文件都具有相同的名称,但扩展名不同。我将如何编写一个shell脚本,在目录中找到所有这些对,并为每对编写并运行上面指定的命令?
我假设,从逻辑的角度来看,我需要循环遍历所有对,获取文件名,进行某种字符串操作(如果甚至可以使用shell脚本),编写命令并运行它
您可以向我指出的任何资源都将深表感谢。只是为了澄清一些伪代码:
for (file in directory) {
string name = file.getname
string command = "ffmpeg -i " + name + ".mov -i " + name + ".mp4 -map 1
-map_metadata 0 -c copy " + name + "_fixed.mp4"
run(command)
}
希望这是有道理的,如果我要澄清更多,请告诉我。谢谢你的阅读。
答案 0 :(得分:0)
当您使用bash
标记此问题时,我会将此草图发送给bash脚本。这应该是一般的,但您可以根据实际需要进行调整:
#!/usr/bin/bash
# for debugging remove the hash from next line:
#set -x
# loop over all .mov files
for FILE in *.mov; do
FILE_MP4="${FILE/.mov/.mp4}"
FILE_FIXED="${FILE/.mov/_fixed.mp4}"
ffmpeg -i "$FILE" -i "$FILE_MP4" -map 1 -map_metadata 0 -c copy "$FILE_FIXED"
done
注释/提示:
for FILE in *.mov
遍历所有扩展名为.mov
但没有其他文件的文件。这很好,因为如果在同一目录中多次调用它甚至可以工作。
for循环将在当前目录中搜索。您可以使用cd
更改为特定目录。 (也可以处理绝对或相对文件路径而不是名称......)
小心选择报价。引用bash
非常强大,但绝对不容易。
要检查此脚本,可以在ffmpeg
命令前加上命令echo
。这就像一场枯竭。 (如果没有echo
“前缀”,你会看到会被调用的内容。)