使用批处理concat数组在ffmpeg中使用-filter_complex

时间:2014-04-20 23:31:05

标签: audio ffmpeg cmd concatenation batch-processing

我在这里尝试做的是编写一个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

2 个答案:

答案 0 :(得分:1)

编辑:添加了一系列文件类型:* .WAV * .MP3 * .FLAC * .M4A

这三个片段将:

:: Give you a list of the filenames in -i "filename1" -i "filename2" format

for %%a in (*.WAV *.MP3 *.FLAC *.M4A) do call set var=%%var%% -i "%%a"
echo %var%

:: Give you the number of .wav files

for /f %%a in ('dir *.WAV *.MP3 *.FLAC *.M4A /b /a-d ^|find /c /v "" ') do set "numfiles=%%a"
echo there are "%numfiles%" files

:: print some text
set /a numfiles=numfiles-1
for /L %%b in (0,1,%numfiles%) do call set array=%%array%% [%%b:0]
echo %array%
pause

注意:在cmd的许多方面都有8 KB的命令长度限制。

答案 1 :(得分:1)

试试看看会发生什么。尝试使用仅在文件夹中的两个文件开始。

@echo off

pushd "C:\Users\James\Input\"

for %%a in ("*.*") do call set var=%%var%% -i "%%a"
:: echo %var%
:: Give you the number of files

for /f %%a in ('dir "*.*" /b /a-d ^|find /c /v "" ') do set "numfiles=%%a"
echo there are "%numfiles%" files

:: dir "C:\Users\James\Input\" /b >> C:\Users\James\Output\filelist.txt

for /L %%b in (0,1,%numfiles%) do call set array=%%array%% [%%b:0]
:: echo %array%
set array=%array:~1%
echo "%array%"

ffmpeg %var% -filter_complex "%array% concat=n=%totalnum%:v=0:a=1 "[a]"" -map "[a]" -acodec libmp3lame -ab 320k "C:\Users\James\Output\outputtestbatch1.mp3"

popd    
pause