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

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

我想使用 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 参数。

相关内容