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


10

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

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

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

Edit2:只是为了澄清,我不想将所有 wma s 合并到某个目录中,我只想将2或3个文件合并为一个。

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


1
您需要支持哪些输入格式?
约翰T

原则上,您可以调整所有这些命令以在彼此之间通过管道传递输出。但是实际上,要使其正常工作是痛苦的,而在失败时进行调试是痛苦的。有一些实用的方法来制作临时文件。我的首选方法是使用mktemp -d /tmp/descriptive_name.XXXXXX创建一个具有参考性名称的临时目录,然后在该目录中处理我的所有临时文件,然后使用rm -r临时目录。
瑞安·汤普森

只是澄清一下,只要在命令行中指定,任何适用于目录中所有 wma的内容*.wma都将适用于较小的列表,例如1.wma 2.wma 3.wma 4.wma(省略5.wma,6.wma和7.wma),只需将它们列出即可这样(而不是使用*.wma)。
嘎嘎吉x德09年

Answers:


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"

解释:

  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(捕获必要的信号)。


唯一的“轻微”的问题是有文件之间的咔嗒声
哈森

@hasen j:如果您想要完美,请使用Audacity或其他wav编辑器。如果您可以跟踪点击的来源,则可以向违规者提出错误报告。
2009年

15

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

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

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

据我所知,SoX对.wma文件的支持为零,因此至少不可避免地首先使用ffmpeg这样的文件进行转换。

ffmpeg -i infile.wma outfile.wav

2
如果所有文件都具有相同的通道,采样率和位深度,则AFAIK sox只能这样工作。否则,您必须全部指定。我没有意识到它也可以解码编码格式,但是我想我一直没有跟上它。
嘎嘎吉x德09年

3

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

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

或mp3:

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

您需要为mp3转换安装la脚。 sudo apt-get install lame libmp3lame0

猫,然后进行转换似乎并不能很好地工作,尽管您可以在网上找到很多引用,说您可以做类似的事情cat *.wma | ffmpeg -i - -acodec ...-这在我的机器上不起作用-仅处理第一个文件。ffmpeg有一个“复制”编解码器,但差别不大。

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


1
好吧,串联呢?
哈森

对于那个很抱歉!阅读我的补充。
DaveParillo

不太确定ffmpeg ...作为WMA解码器还可以,但是对OGG编码器有很多抱怨。至少用于-acodec libvorbis避免ffmpeg的内置编码器。
2009年

3

要连接和转码音频文件,这是您要遵循的工作流程:

  1. 将输入的音频文件解码为WAV / PCM数据,
  2. 串联WAV,
  3. 编码WAV以输出音频编解码器文件。

这些步骤中的处理将对WAV数据执行级联,这是最容易处理且损耗最小的。而且由于您仍要进行代码转换,因此您必须在此过程中的某处解码为WAV。不妨利用它。

这是我建议的步骤。我们将ffmpeg用于解码,sox连接和oggenc编码。你可以代替其他工具的任何步骤- mencoder与其他正常工作的解码器和编码的Ogg可以作为编码器的任何工具-但我想你会捉襟见肘找到一个比一个更好的工具sox为级联。

  1. find *.wma -exec ffmpeg -i {} outfile.{}.wav \;
    (这ffmpeg -i infile.wma outfile.infile.wma在当前目录中的每个WMA文件上运行)

  2. sox outfile* all.wav
    (注意outfile与我们在步骤1中给输出文件的前缀相同)

  3. oggenc all.wav all.ogg 您可能需要在此处进行一些质量设置,但这将提供不错的质量默认设置。我没有获得喜欢的结果ffmpeg,但您可能更喜欢它,因此下面提供了ffmpeg的示例。

请注意,sox除非所有WAV文件都使用相同的格式,否则该命令将无法正常工作-例如,如果某些文件为22kHz,而某些文件为44.1kHz,则需要sox通过命令行开关来识别它们,并指定所需的格式。输出。我不知道任何命令行工具能够像sox串联步骤一样使用。您可能会在第1步中输出为原始PCM格式并cat在第2 步中使用,但这仅在它们具有相同格式的情况下才有效,并且您需要对解码器和编码器都非常特定他们应该期望的格式。

使用ffmpeg编码:网上有很多帖子抱怨ffmpeg的内置Vorbis编码器不是很好。如果您的版本是使用libvorbis支持构建的,请-acodec libvorbis改用。示例命令行:

ffmpeg -i all.wav -acodec libvorbis -ac 2 -ab 128k all.ogg

1

不适用于.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文件合并为一个文件。


1

Mencoder可以在没有临时文件的情况下连接和转码视频(此处为简单示例)。在名为aconvert的某个地方有一个脚本,该脚本欺骗Mencoder进行纯音频操作(通常拒绝这样做)。这两件事结合起来似乎可以满足您的要求。

编辑:我找到了aconvert.sh。不幸的是,它仅用于转换一个音频文件。但是无论如何这都是代码,以防万一有人想用它来编写可转换多个音频文件的命令行。

#!/bin/sh

# Author: Jonas Jermann
# Description: A hack to allow mencoder to encode from an audio only file

if [ "$1" = "" ]; then
    echo "Usage: $0 <\"input file\"> <\"output file\"> <\"options\">"
    exit 0
fi

options=${3:-"-oac mp3lame"}

mencoder -demuxer rawvideo -rawvideo w=1:h=1 -ovc copy -of rawaudio -endpos `mplayer -identify $1 -frames 0 2>&1 | grep ID_LENGTH | cut -d "=" -f 2` -audiofile $1 -o $2 $options $1


0

以为我会回答我的问题。这可能不是最优雅的方法,但它确实达到了我想要的效果。

第1步:转换为OGG(用途mplayerpacpl并且ruby,所有可从免费的Debian回购我。)

#! /usr/bin/ruby

ARGV.each do |target|
  file_ext = target.scan(/\.\w*$/)[0]
  name = target.sub(file_ext, "")

  `mplayer -novideo -ao pcm:file="tmp.wav" "#{target}"`
  `pacpl -t ogg --outfile "#{name}" tmp.wav`
  `rm tmp.wav`
end

步骤2:连接OGG文件

cat *ogg > big-file.ogg

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.