如何通过命令行或批处理脚本与ffmpeg转换整个目录/文件夹?
当前回答
前面的答案只会创建一个名为out.mov的输出文件。要为每一部老电影创建一个单独的输出文件,可以试试这个方法。
for i in *.avi;
do name=`echo "$i" | cut -d'.' -f1`
echo "$name"
ffmpeg -i "$i" "${name}.mov"
done
其他回答
窗口:
@echo off
for /r %%d in (*.wav) do (
ffmpeg -i "%%~nd%%~xd" -codec:a libmp3lame -c:v copy -qscale:a 2 "%
%~nd.2.mp3"
)
这是质量2的可变比特率,如果你想,你可以把它设置为0,但除非你有一个非常好的扬声器系统,否则在我看来这是毫无价值的
如果你有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。
在Windows上:
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec mp3 "%~nG.mp3"
当然,现在PowerShell出现了,专门设计来让这样的事情变得非常简单。
是的,除了Windows, PowerShell也可以在其他操作系统上使用,但它是预装在Windows上的,所以这应该对每个人都有用。
首先,你想要列出当前目录中的所有文件,所以,我们将从:
ls
如果你想递归地转换子目录中的所有文件,也可以使用ls -Recurse。
然后,我们将这些文件过滤下来,只有我们想转换的文件类型-例如。“avi”。
ls | Where { $_.Extension -eq ".avi" }
之后,我们将通过ForEach将该信息传递给FFmpeg。
对于FFmpeg的输入,我们将使用FullName——这是文件的整个路径。对于FFmpeg的输出,我们将使用Name -但是将结尾的.avi替换为.mp3。所以,它看起来是这样的:
$_.Name.Replace(".avi", ".mp3")
所以,让我们把所有这些放在一起,这是结果:
ls | Where { $_.Extension -eq ".avi" } | ForEach { ffmpeg -i $_.FullName $_.Name.Replace(".avi", ".mp3") }
这将改变所有人。”通过FFmpeg将avi"文件转换为".mp3"文件,只需替换引号中的三个内容来决定您想要的转换类型,并随时向FFmpeg中的ForEach中添加任何其他参数。
您还可以更进一步,在末尾添加Remove-Item以自动删除旧文件。
如果ffmpeg不在您的路径中,而实际上在您当前所在的目录中,请在那里写入./ffmpeg,而不仅仅是ffmpeg。
希望这对大家有所帮助。