【问题标题】:Working with -filter_complex in ffmpeg with a batch concat array使用批处理 concat 数组在 ffmpeg 中使用 -filter_complex
【发布时间】: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


【解决方案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

【讨论】:

  • 确保您的引用也正常,因为它看起来很奇怪。 -i 不是必需的,因为根据您发布的规则,每个文件名都有一个 -i
  • 哎呀,整理好了!检查我的最终编辑以获取完成的代码。非常感谢您的帮助!
【解决方案2】:

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

这三个 sn-ps 将:

:: 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 的命令长度限制。

【讨论】:

  • 太棒了,谢谢!我想知道,有没有办法包含多个文件类型?我将使用 WAV、MP3、FLAC 和 M4A 文件。如果目录中只有我需要的音频文件而没有其他文件,for %%a in (*.*) do call set var=%%var%% -i "%%a" 会工作吗?
  • 参见我上面的编辑,可以简单地添加文件规范集。使用*.* 也将包含批处理文件名,但这可以解决。请注意,如果您有一堆文件,那么您可能会用完命令行上的空间。
  • 请检查我的问题编辑,出现了更多 ffmeg 问题!感谢您迄今为止的帮助。
  • 使用*.* 将包含批处理文件名。
  • 批次在另一个地方,我正在使用输入文件夹的完整路径,其中只包含我需要组合的东西。
猜你喜欢
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
相关资源
最近更新 更多