将 Sox 和 FFMPEG 连接在一起

将 Sox 和 FFMPEG 连接在一起

我正在处理多种不同格式的音频文件,我想使用 FFMPEG 和 SoX 统一它们的格式和配置。

我的流程有两个步骤:

  1. 将文件(无论其最初是什么)转换为 PCM 16 位小端 WAV 文件:
    ffmpeg -i input.wav -c:a pcm_s16le output.wav
  2. 在 Sox 中处理文件,使其符合我们需要的采样率和通道数:
    sox input.wav output.flac channels 2 rate 44.1k

理想情况下,我希望将这两个命令连接在一起,以避免创建不必要的文件。

不过,实际上我在让格式正常工作方面遇到了很多麻烦。

SoX 抱怨它需要明确地知道传入音频的格式,而我在执行时甚至不知道这一点。我知道 PCM 音频的格式,但不确定通道数或传入音频的采样率。

有没有办法将这两个命令连接在一起,或者更好,只需要使用一个工具来完成这项工作?

我使用两种工具而不是仅仅尝试使用一种工具的原因是:

FFMPEG

  • 不确定是否有办法通过复制通道来安全地将单声道音频流转换为立体声音频流。 (SoX 本身就这样做。)
  • 不确定如何更改采样率。 (SoX 本身就这样做。)
  • 不确定如何使用最佳压缩率输出到 FLAC。

索克斯

  • 无法像 FFMPEG 那样进行音频格式检测。如果我有一个没有扩展名的文件,SoX 会要求我手动指定格式,这对我的应用程序根本不起作用。

答案1

使用 FFmpeg 进行解码,使用 sox 格式进行管道以避免格式检测问题,使用 8 级 FLAC 压缩以 16 位输出。

ffmpeg -hide_banner -i input.wav -f sox - |
 sox -t sox - -b 16 -C 8 output.flac channels 2 rate 44.1k

答案2

我认为sox如果要从文件头确定输入格式,则需要寻求其输入,并且这与管道不兼容。

我认为 ffmpeg 可以做你想做的一切,尽管我不完全确定。我对它不熟悉,文档也很清楚。

ffmpeg -i "$input" -compression_level 9 -ac 2 -ab 44100 output.flac

或者,mencoder 应该能够完成类似的工作。

mencoder "$input" -oac lavc -lavcopts=acodec=flac:abitrate=44.1:o=compression_level=9 -af channels=2 output.flac

相关内容