Linux命令连接音频文件并将它们输出到ogg

has*_*sen 13 audio linux command-line

我需要什么命令行工具来连接多个音频文件并将它们输出为一个 ogg(和/或 mp3)?

如果你能提供完整的命令来连接和输出到 ogg,那就太棒了。

编辑:输入文件(在我的情况下,目前)是wma格式,但理想情况下它应该足够灵活以支持广泛的流行格式。

Edit2:只是为了澄清,我不想合并某个目录中的所有 wmas,我只想将 2 或 3 个文件连接成一个。

感谢您提出的解决方案,但它们似乎都需要创建临时文件,如果可能的话,我想避免这种情况。

gol*_*udo 15

SoX可以处理大量音频格式,具体取决于它编译的库,并且可以使用简单的命令行连接文件

sox file1.wav file2.mp3 file3.flac outfile.ogg
Run Code Online (Sandbox Code Playgroud)

我相信这仅在源音频文件都具有相同数量的通道时才有效,但我尚未对此进行测试。

据我所知,SoX 对 .wma 文件的支持为零,因此至少首先使用ffmpeg 之类的文件转换这些文件可能是不可避免的。

ffmpeg -i infile.wma outfile.wav
Run Code Online (Sandbox Code Playgroud)

  • AFAIK sox 只有在所有文件都具有相同的通道、采样率和位深度时才会这样工作;否则你必须为所有人指定。我没有意识到它也会解码编码格式,但我想我没有跟上它。 (2认同)

小智 9

这是我的建议:使用与命名管道连接的mplayer 和 oggenc

  • 使用mplayer解码音频。它可以播放多种音频(和视频)格式,也可以播放多个文件。

  • 用于oggenc将音频编码为 Ogg Vorbis。

  • 为了消除对临时文件的需要,使用命名管道 在编码器和解码器之间传输数据。

将其放入脚本中:

#!/bin/sh
# Usage: ./combine2ogg destination.ogg source1.wma source2.wma ...
# Requires: mplayer, oggenc
destination="$1"
shift
readpipe="$destination.tmpr"
writepipe="$destination.tmpw"
mkfifo "$readpipe"
mkfifo "$writepipe"
cat "$writepipe" > "$readpipe" &
mplayer -really-quiet -slave -nolirc -vc null -vo null -ao "pcm:fast:file=$writepipe" "$@" &
oggenc --quiet -o "$destination" "$readpipe"
rm -f "$readpipe"
rm -f "$writepipe"
Run Code Online (Sandbox Code Playgroud)

解释:

  1. 从第一个命令行参数中获取目标文件名。
  2. 删除第一个命令行参数,只留下源文件名。
  3. 为 oggenc 读取的管道创建一个名称。
  4. 为 mplayer 写入的管道创建一个名称
  5. 创建管道。
  6. 使用 cat 连续将 writepipe 转储到 readpipe(这有助于避免 mplayer 可能终止的问题,但防止 oggenc 在发生这种情况时认为它已完成)
  7. 使用 mplayer 从源文件解码音频。有选项-really-quiet -slave -nolirc可以禁用消息并使其不读取键盘或遥控器。有选项-vc null -vo null可以禁用视频编码和输出。该-ao选项指示它以 WAV 格式将音频输出到命名的写入管道。
  8. 在前面的命令运行时,同时使用 oggenc 从命名的读取管道编码到 Ogg。
  9. 删除命名管道。

需要改进的地方:如果其中一个命令失败(使用set -e),则提前终止脚本,但仍会正确清理 fifo(捕获必要的信号)。