如何使用 ffmpeg 对目录中的所有文件进行转码

Sup*_*a64 1 scripts ffmpeg

我想制作一个脚本,将所有无损文件从我的相机转码为 3mb/s,并将编解码器更改为 h.264。我找到了一个命令,它将文件导出为一个大文件,但我想要一些可以保留名称并将输出放在另一个目录中的东西。请注释说明命令的每个部分的作用,以便我可以根据需要对其进行修改。

编辑

这有效:

for file in *.avi; do ffmpeg -i "$file" "${file%.avi}".webm; done
Run Code Online (Sandbox Code Playgroud)

我只想知道每个部分的作用,以便我可以根据需要对其进行修改。

llo*_*gan 5

for file in *.avi; do ffmpeg -i "$file" "${file%.avi}".webm; done
Run Code Online (Sandbox Code Playgroud)

这是一个 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。