Linux 命令连接音频文件并将其输出为 ogg

Linux 命令连接音频文件并将其输出为 ogg

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

如果您可以提供完整的命令来连接并输出到 ogg,那就太棒了。

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

編輯2:澄清一下,我不想合并全部 wma在某个目录中,我只想将 2 个或 3 个文件连接成一个。

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

答案1

这是我的建议:使用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"

解释:

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

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

答案2

索克斯可以处理大量音频格式(具体取决于编译时所针对的库),并且可以使用简单的命令行连接文件

sox file1.wav file2.mp3 file3.flac outfile.ogg

我相信这只有当源音频文件具有相同数量的通道时才有效,但我还没有测试过。

据我所知,SoX 对 .wma 文件没有任何支持,因此至少要使用类似ffmpeg第一个可能是不可避免的。

ffmpeg -i infile.wma outfile.wav

答案3

我会用ffmpeg。要将 wma 转换为 ogg vorbis,请尝试:

ffmpeg -i sample.wma -acodec vorbis -aq 100 sample.ogg

或 mp3:

ffmpeg -i input.wma -acodec libmp3lame output.mp3

您需要安装 lame 来进行 mp3 转换。sudo apt-get install lame libmp3lame0

Cat,然后转换似乎效果不佳,尽管您可以在网上找到很多参考资料,说您可以做类似的事情cat *.wma | ffmpeg -i - -acodec ...- 这在我的计算机上不起作用 - 仅处理第一个文件。ffmpeg 有一个“复制”编解码器,但没什么区别。

首先使用 ffmpeg 进行转换,然后 cat *.ogg > output.ogg 对我有用。

答案4

不适用于 .ogg 文件,但是mp3wrap可以将多个 .mp3 文件合并为一个文件。因此,在命令行中,您可以执行以下操作

for FILE in *.wma; do ffmpeg -i "$FILE" "`basename "$FILE" .wma`.mp3"; done
mp3wrap bigmp3_MP3WRAP.mp3 *.mp3

这将使用ffmpeg将所有 .wma 文件转换为 .mp3,然后将所有 .mp3 文件合并为一个文件。

相关内容