我想编写一个脚本,将相机中的所有无损文件转码为 3mb/s,并将编解码器更改为 h.264。我找到了一个命令,可以将文件导出为一个大文件,但我想要保留名称并将输出放在另一个目录中的东西。请附上注释,描述命令的每个部分的作用,以便我可以根据自己的需要进行修改。
编辑
这有效:
for file in *.avi; do ffmpeg -i "$file" "${file%.avi}".webm; done
我只是想知道每个部分的作用,以便我可以根据自己的需要进行修改。
答案1
for file in *.avi; do ffmpeg -i "$file" "${file%.avi}".webm; done
这是 Bash 的“for 循环”,非常适合重复任务。逐节介绍:
for file in *.avi;
file
将成为下一节中的变量,该变量将在每个连续循环中引用当前目录中的每个特定 avi。
定制内容:
file
可以重新命名任何东西:i
并且f
似乎被广泛使用。您可以更改
*.avi
为您需要的任何输入格式,例如*.mkv
。
do ffmpeg -i "$file" "${file%.avi}".webm;
这将ffmpeg
针对每个 avi 运行。花括号中的部分是使用参数扩展删除.avi
文件名的一部分。例如,如果 avi 文件名为dog.avi
,则输出将命名为dog.webm
。如果仅使用"$file.webm"
进行输出,则输出最终将为dog.avi.webm
。
定制内容:
您可以
ffmpeg
照常添加任何选项。该
%.
部分应使用与部分相同的扩展名for file in
,或者您可以更改%.avi
为%.*
通配符。.webm
可以更改为您需要的任何输出容器格式。
如果希望将新文件输出到名为的目录中newvids
,则创建新目录并将命令更改为:"newvids/${file%.avi}.webm"
done
这告诉循环命令已完成,现在$file
可以参考下一个 avi。