如何通过命令行或批处理脚本与ffmpeg转换整个目录/文件夹?
当前回答
如果您想要一个图形界面来使用ffmpegX进行批处理,请尝试Quick Batcher。它是免费的,并将使用您最后的ffmpegX设置来转换您放入其中的文件。
注意,不能将文件夹拖放到Quick Batcher上。所以选择文件,然后把他们通过快速批处理。
其他回答
对于Linux和macOS,这可以在一行中完成,使用参数展开来更改输出文件的扩展名:
for i in *.avi; do ffmpeg -i "$i" "${i%.*}.mp4"; done
为了逗你笑,这里有鱼壳的解决方案:
for i in *.avi; ffmpeg -i "$i" (string split -r -m1 . $i)[1]".mp4"; end
下面的脚本在Windows上的Bash中工作得很好(所以它在Linux和Mac上也应该工作得很好)。它解决了我在其他解决方案中遇到的一些问题:
处理子文件夹中的文件 用目标扩展替换源扩展,而不仅仅是附加它 适用于名称中有多个空格和多个点的文件 (详见这个答案。) 可以运行时,目标文件存在,提示之前覆盖
ffmpeg-batch-convert.sh:
sourceExtension=$1 # e.g. "mp3"
targetExtension=$2 # e.g. "wav"
IFS=$'\n'; set -f
for sourceFile in $(find . -iname "*.$sourceExtension")
do
targetFile="${sourceFile%.*}.$targetExtension"
ffmpeg -i "$sourceFile" "$targetFile"
done
unset IFS; set +f
示例调用:
$ sh ffmpeg-batch-convert.sh mp3
作为奖励,如果你想删除源文件,你可以像这样修改脚本:
sourceExtension=$1 # e.g. "mp3"
targetExtension=$2 # e.g. "wav"
deleteSourceFile=$3 # "delete" or omitted
IFS=$'\n'; set -f
for sourceFile in $(find . -iname "*.$sourceExtension")
do
targetFile="${sourceFile%.*}.$targetExtension"
ffmpeg -i "$sourceFile" "$targetFile"
if [ "$deleteSourceFile" == "delete" ]; then
if [ -f "$targetFile" ]; then
rm "$sourceFile"
fi
fi
done
unset IFS; set +f
示例调用:
$ sh ffmpeg-batch-convert.sh mp3
如果您想要一个图形界面来使用ffmpegX进行批处理,请尝试Quick Batcher。它是免费的,并将使用您最后的ffmpegX设置来转换您放入其中的文件。
注意,不能将文件夹拖放到Quick Batcher上。所以选择文件,然后把他们通过快速批处理。
另一个简单的解决方案是使用xargs:
ls *。Avi | xargs -i -n1 ffmpeg -i {} "{}.mp4"
一个小缺陷是输出文件的尴尬命名(例如input.avi.mp4)。一个可能的解决方法是:
ls *。Avi | xargs -i -n1 bash -c "i={};Ffmpeg -i {} "\${i%.*}.mp4""