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


当前回答

我在linux中使用这一行程序将文件(通常是H265)转换为我可以在Kodi上毫无问题地播放的东西:

for f in *.mkv; do ffmpeg -i "$f" -c:v libx264 -crf 28 -c:a aac -b:a 128k output.mkv; mv -f output.mkv "$f"; done

这将转换为临时文件,然后替换原始文件,以便转换后名称保持不变。

其他回答

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

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

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

这是我用来批量转换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 /s /b /o:gn *.mp4') DO ffmpeg -i "%G" -c copy "%~pG%~nG.mkv"

这将所有mp4文件转换为mkvs,包括子目录中的文件,并将mkv文件放在mp4文件所在的位置,即文件C:\temp\test.mp4将其对应的mkv文件放在C:\temp\test.mkv中

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

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

为了逗你笑,这里有鱼壳的解决方案:

for i in *.avi; ffmpeg -i "$i" (string split -r -m1 . $i)[1]".mp4"; end