我想使用 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,因为它已经在其他地方安装并使用了。
答案1
您可以尝试使用连接筛选;它需要重新编码,因此会占用更多系统资源(在这种情况下,在任何现代计算机上占用的资源都非常少),但 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]
。
答案2
我认为 wav 的最佳选择是使用袜子,不是 ffmpeg:
$ sox short1.wav short2.wav short3.wav long.wav
解决方案来自如何附加一堆 .wav 文件同时保留(非零填充的)数字顺序?
如果当前目录中有许多 wav 文件
$ sox '*' long.wav
警告,最后一个文件sox
将被覆盖,因此在这种情况下 - 如果 long.wav 存在,它将被销毁,然后由其他文件重新生成。
答案3
这FFmpeg wiki 提及并非所有文件类型都可以使用该concat
协议。它适用于大多数 MPEG 容器和比特流,但显然不适用于带有 PCM 音频的 WAV 文件。
您不必创建临时文件并使用它。使用 Bash(或其他支持流程替代),你可以用一个命令完成所有操作:
ffmpeg -f concat -i <( for f in *.wav; do echo "file '$(pwd)/$f'"; done ) output.wav
进程替换<( )
会动态创建一个可以读取的文件(或者更准确地说,文件描述符)ffmpeg
。此文件将包含当前目录中每个文件的路径.wav
。我们必须在其前面加上前缀,以$(pwd)
获取相对于当前目录的正确路径,而不是相对于文件描述符的正确路径。
当然,替换中的命令可以更改为其他命令。
答案4
在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 参数。