【发布时间】:2014-06-05 00:09:52
【问题描述】:
我在这里要做的是编写一个 ffmpeg 脚本,该脚本从一个文件夹中获取所有歌曲,并使用 Windows 中的命令行将它们组合成一个音频文件。
目前为止
ffmpeg -i "pathforinput1" -i "pathforinput2" -i "pathforinputn" -filter_complex "[0:0] [1:0] concat=n=(number of songs goes here):v=0:a=1 "[a]"" -map "[a]" -acodec libmp3lame -ab 320k "output file.mp3"
我的问题是我想把它和现有的脚本结合起来:
for %A in ("input folder\*.extension") do ffmpeg
创建一个使用-i "%A" 作为输入的总脚本。我在这里遇到的问题是每个输入文件都需要数组-filter_complex "[0:0] [1:0] 中的一个条目,以及concat=n=(number of files) 中存在的输入文件总数。我愿意使用批处理脚本来实现这一点,但我不知道如何查找文件夹中的文件总数,然后为每个文件创建一个数组(例如,如果有 7 首歌曲数组将是 [0:0] [1:0] [2:0] [3:0] [4:0] [5:0] [6:0])。
任何使这成为可能的帮助或指示都会很棒。 this 问题中的某个人设法为 Unix 系统制作了类似的东西,但我使用的是批处理文件,我不知道如何为 Windows 修改它。
提前感谢您的帮助
好的,在第一位评论者的帮助下取得了进展。但是,我认为 ffmpeg 不喜欢我所做的。到目前为止,我的代码是:
:: Give you a list of the .wav filenames in -i "filename1" -i "filename2" format
for %%a in ("C:\Users\James\Input\*.*") do call set var=%%var%% -i "%%a"
echo %var%
:: Give you the number of .mp3 files
for /f %%a in ('dir "C:\Users\James\Input\*.*" /b /a-d ^|find /c /v "" ') do set "numfiles=%%a"
echo there are "%numfiles%" files
set /a totalnum=numfiles
:: dir "C:\Users\James\Input\" /b >> C:\Users\James\Output\filelist.txt
:: print some text
set /a numfiles=numfiles-1
for /L %%b in (0,1,%numfiles%) do call set array=%%array%% [%%b:0]
:: for /L %%b in (0,1,%numfiles%) do call set array=%%array%% [0:0]
echo %array%
for /f "tokens=* delims= " %%C in ('echo %array% ') do set array=%%C
set array=%array:~0,-1%
echo %array%
:: for %%d in ("C:\Users\James\Input\*.*") do ffmpeg -i "%%d" -filter_complex "%array% concat=n=%totalnum%:v=0:a=1 "[a]"" -map "[a]" -acodec libmp3lame -ab 320k "C:\Users\James\Output\outputtestbatch1.mp3"
for %%d in ("C:\Users\James\Input\*.*") do ffmpeg -i "%%d" -filter_complex "%array% concat=n=%totalnum%:v=0:a=1 "[a]"" -map "[a]" -acodec libmp3lame -ab 320k "C:\Users\James\Output\outputtestbatch1.mp3"
pause`
我现在遇到的问题是,我认为 ffmpeg 假设每个输入文件都有音频流 [0:0],而不是一个接一个地递增它们。有没有办法用我正在使用的输入法解决这个问题?
第二次编辑L:成功!我稍微修改了 foxidrive 的脚本,因为它配置有点错误。最终产品在这里:
@echo off
for %%a in ("C:\Users\James\Input\*.*") do call set var=%%var%% -i "%%a"
:: echo %var%
:: Give you the number of files
for /f %%a in ('dir "C:\Users\James\Input\*.*" /b /a-d ^|find /c /v "" ') do set "numfiles=%%a"
echo there are "%numfiles%" files
for /L %%b in (0,%numfiles%) do call set array=%%array%% [%%b:0]
set array=%array:~1%
echo "%array%"
ffmpeg %var% -filter_complex "%array% concat=n=%numfiles%:v=0:a=1 "[a]"" -map "[a]" -acodec libmp3lame -ab 320k "C:\Users\James\Output\outputtestbatch1.mp3"
popd
pause
【问题讨论】:
-
是
For /L命令的变化吗?您在那里的更改使语法错误。 -
考虑使用脚本语言来做这件事:)
-
@foxidrive 是的,它在数组中生成 n + 1 个结果而不是 n 个结果,我刚刚删除了
for /L %%b in (0,%numfiles%)中的 ,1,它现在可以正常工作了。 -
它现在只给出一个结果
[0:0],仅此而已。在for /L上方的行上添加此行set /a numfiles-=1并将,1放回去。我在几次编辑过程中删除了从变量中取出一个的行,但没有意识到。
标签: audio ffmpeg cmd concatenation batch-processing