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

Man*_*anu 55 ffmpeg combine wav concatenation

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

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

命令:

ffmpeg -f concat -i mylist.txt -c copy output.wav
Run Code Online (Sandbox Code Playgroud)

文件 :

#mylist.txt
file '1.wav'
file '2.wav'
file '3.wav'
file '4.wav'
Run Code Online (Sandbox Code Playgroud)

但正如您所看到的,问题是我必须创建一个文本文件来指定要连接的 WAV 文件列表。

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

ffmpeg -i 1.wav -i 2.wav -i 3.wav -i 4.wav output.wav 
Run Code Online (Sandbox Code Playgroud)

或者

ffmpeg -i "concat:1.wav|2.wav|3.wav|4.wav" -c copy output.wav
Run Code Online (Sandbox Code Playgroud)

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

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

evi*_*oup 50

您可以尝试使用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
Run Code Online (Sandbox Code Playgroud)

例如,如果您有五个输入文件,请使用n=5并添加[4:0].

  • @Keavon:你确定吗?此处 ffmpeg(版本 N-49352-gc46943e x64)抱怨“为“concat”过滤器指定的输入太多。当我尝试使用原始代码仅处理 2 个输入时。但是当我删除 `[2:0][3:0]` 时它可以工作......这对我来说很有意义,因为在这种情况下没有像流 `2:0` 和 `3:0` 这样的东西...... . (15认同)
  • 注意:不要自定义`[0:0][1:0][2:0][3:0]`来匹配文件数量。完全按照它说的使用它。您唯一应该更改的是输入文件和 `n=4`。 (7认同)
  • 我同意@BigueNique。我也遇到了同样的错误,虽然感觉有点傻,但我写了一些代码来生成给定 `n` 的正确序列。 (4认同)

Héc*_*cci 31

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

$ sox short1.wav short2.wav short3.wav long.wav
Run Code Online (Sandbox Code Playgroud)

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

  • 问题正是关于`.wav` (6认同)
  • 该问题明确指出仅需要使用 ffmpeg 的解决方案! (4认同)
  • 请务必将所需的输出文件名放在该参数列表的末尾,否则您将覆盖列出的最后一个文件!幸运的是,我还有另一份副本。使用 sox 过早按 Enter 是危险的。不过,这对我来说效果很好。谢谢赫克托! (3认同)

slh*_*hck 18

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

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

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

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

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

  • 如果你收到 `Unsafe file name` 错误,你需要在 `-i` 之前添加 `-safe 0` 选项。参考 /sf/ask/2729784781/ (5认同)

Iva*_*hev 6

另一种选择是使用concat

ffmpeg -i "concat:file1.mp3|file2.mp3|file3.mp3" -acodec 复制出.mp3

  • 这是行不通的。它最终只使用第一个文件。 (8认同)
  • 我测试了这个,它似乎不起作用 (3认同)