如何通过命令行或批处理脚本与ffmpeg转换整个目录/文件夹?


当前回答

对于任何想要用ffmpeg批量转换任何东西,但想要有一个方便的Windows界面的人,我开发了这个前端:

https://sourceforge.net/projects/ffmpeg-batch

它为ffmpeg添加了一个窗口时尚界面,进度条和时间剩余信息,这些功能是我在使用ffmpeg时经常错过的。

其他回答

复制@HiDd3n,你也可以这样做,如果你想递归搜索文件目录,以防你有很多文件夹:

for /r %i in (*.webm) do "C:\Program Files\ffmpeg\bin\ffmpeg.exe" -i "%i" "%~ni.mp3"

下面的脚本在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

这里有点像代码高尔夫,但由于到目前为止几乎所有的答案都是bash(除了一个孤独的cmd),这里有一个使用powershell的windows跨平台命令(因为很棒):

ls *.avi|%{ ffmpeg -i $_ <ffmpeg options here> $_.name.replace($_.extension, ".mp4")}

你可以改变*。Avi到与源视频相匹配的地方。

如果你有GNU并行,你可以将vid_dir以下的所有。avi文件并行转换为mp4,使用你的CPU内核

find vid_dir -type f -name '*.avi' -not -empty -print0 |
    parallel -0 -j -1 ffmpeg -loglevel fatal -i {} {.}.mp4

要从/转换为不同的格式,请更改'*。Avi '或。mp4。GNU parallel在大多数Linux发行版的存储库中以一个通常称为parallel的包的形式列出。

这是我用来批量转换avi到1280x mp4

FOR /F "tokens=*" %%G IN ('dir /b *.avi') DO "D:\Downloads\ffmpeg.exe" -hide_banner -i "%%G" -threads 8 -acodec mp3 -b:a 128k -ac 2 -strict -2 -c:v libx264 -crf 23 -filter:v "scale=1280:-2,unsharp=5:5:1.0:5:5:0.0" -sws_flags lanczos -b:v 1024k -profile:v main -preset medium -tune film -async 1 -vsync 1 "%%~nG.mp4"

作为一个cmd文件,运行它,循环找到该文件夹中的所有avi文件。

调用MY(更改为您的)ffmpeg,传递输入名称,设置为缩放锐化。我可能不需要CRF和“-b:v 1024k”…

输出文件是减去扩展名的输入文件,mp4作为新的ext。