使用单个命令连接多个WAV文件,无需额外文件


30

我想使用FFMPEG将多个WAV文件连接成一个WAV文件。

我使用了以下命令,它生成了所需的文件。

命令:

ffmpeg -f concat -i mylist.txt -c copy output.wav

档案:

#mylist.txt
file '1.wav'
file '2.wav'
file '3.wav'
file '4.wav'

但是你可以看到问题是我必须创建一个文本文件来指定要连接的WAV文件列表。

我可以做所有这些任务,但我更喜欢一个看起来像的命令

ffmpeg -i 1.wav -i 2.wav -i 3.wav -i 4.wav output.wav 

要么

ffmpeg -i "concat:1.wav|2.wav|3.wav|4.wav" -c copy output.wav

我已经尝试了这两个简单的命令,但它们只返回声音1.wav 请帮我写一个命令(或纠正上面的两个命令),以达到预期的效果。

请不要建议其他媒体编码器/编辑器,我只想使用FFMPEG,因为它已经安装并在其他地方使用。

Answers:


33

您可以尝试使用concat 过滤器 ; 它需要重新编码,因此需要更多的系统资源(在这种特殊情况下任何模糊的现代计算机上的数量相当少),但PCM - > PCM音频应该在数学上无损。在你的情况下,你会使用类似的东西:

ffmpeg -i input1.wav -i input2.wav -i input3.wav -i input4.wav \
-filter_complex '[0:0][1:0][2:0][3:0]concat=n=4:v=0:a=1[out]' \
-map '[out]' output.wav

如果您有五个输入文件,请使用n=5


4
注意:请勿自定义[0:0][1:0][2:0][3:0]以匹配文件数。完全按照原样使用。你唯一应该改变的是输入文件和n=4
Keavon 2015年

6
@Keavon:你确定吗?这里ffmpeg(版本N-49352-gc46943e x64)抱怨Too many inputs specified for the "concat" filter.我尝试只处理原始代码的2个输入。它的工作原理尽管当我删除[2:0][3:0]......这对我来说很有意义,因为在这种情况下,有没有这样的东西流2:03:0...
Bigue NIQUE

我同意@BigueNique。我也遇到了同样的错误,虽然感觉有点傻,但是写了一些代码来生成给定的正确序列n
Ryan DuVal

15

我认为最好的选择是使用sox,而不是ffmpeg:

$ sox short1.wav short2.wav short3.wav long.wav

解决方案来自如何在保留(非零填充)数字排序的同时附加一堆.wav文件?


这可能有用.wav,但sox似乎不支持.mp3
Aaron Franke

问题正是约.wav
埃克托M. Monacci

我知道,我只是为那些尝试将此方法与非wav文件一起使用的人添加注释。
Aaron Franke

问题明确指出仅使用ffmpeg需要解决方案!
Manu

sox也可以支持.mp3文件
本杰明

9

FFmpeg的维基提到使用concat的协议是不可能的所有文件类型。它适用于大多数MPEG容器和比特流,但显然不是带有PCM音频的WAV文件。

您不一定要创建临时文件并使用它。使用Bash(或其他支持进程替换的 shell ),您可以在一个命令中执行所有操作:

ffmpeg -f concat -i <( for f in *.wav; do echo "file '$(pwd)/$f'"; done ) output.wav

进程替换<( )创建一个文件 - 或者确切地说,是一个ffmpeg可以读取的文件描述符。该文件将包含.wav当前目录中每个文件的路径。我们必须为它添加前缀$(pwd)以获取相对于当前目录的正确路径,而不是相对于文件描述符。

当然,替换中的命令可以更改为其他内容。


2
如果Unsafe file name出现错误,您需要先-safe 0选择-i。REF。stackoverflow.com/q/38996925/297679
Nobu

3

另一个选择是使用concat

ffmpeg -i“concat:file1.mp3 | file2.mp3 | file3.mp3”-acodec copy out.mp3


1
欢迎使用超级用户:虽然这可能会或可能不会回答这个问题,(已经接受了答案)如果您能解释为什么您的解决方案可以使用详细信息并且易于遵循说明,那么这将是一个更好的答案。如果您认为您的答案是正确的,请执行这些操作并重新编辑。请花几分钟时间阅读: - superuser.com/help .Answering:superuser.com/help/how-to-answer,再次欢迎超级用户
.Thankyou

我测试了这一点,它似乎并没有工作
尼克龙

1

在Win8的Cmd.EXE .BAT脚本中:

Rem Get number of source files
For /F %%A In ('Dir *.3gp /B /A-D ^| Find /C /V ""') Do      Set FilCnt=%%A

Rem Build list of source filenames
Set Lst=
For    %%A In (     *.3gp                          ) Do Call Set Lst=%%Lst%% -i %%A

Rem Concat and Convert sources to target
FFMPeg.EXE %Lst% -filter_complex concat=n=%FilCnt%:v=0:a=1 -vn Output.OGG

这样,您就不必理会源文件名或concat-count参数。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.