オーディオファイルを連結してoggに出力するLinuxコマンド


10

複数のオーディオファイルを連結し、それらを1つのogg(またはmp3)として出力するために必要なコマンドラインツールは何ですか?

連結してoggに出力するための完全なコマンドを提供できれば、それは素晴らしいことです。

編集する :入力ファイル(私の場合は現在)は wma フォーマット、しかし理想的にはそれは広範囲のポピュラーなフォーマットをサポートするのに十分柔軟であるべきです。

編集2 :わかりやすくするために、マージしたくない すべて wma あるディレクトリで、2つか3つのファイルを1つに連結したいだけです。

提案された解決策をありがとう、しかしそれらはすべて一時ファイルを作成することを必要とするように思われる。


1
どの入力フォーマットをサポートする必要がありますか?
John T

原則として、これらすべてのコマンドを微調整して、相互間で出力をやり取りすることができます。しかし実際には、動作させるのは面倒で、失敗したときはデバッグするのも面倒です。一時ファイルを作成する実用的な方法があります。私の好ましい方法は使用することです mktemp -d /tmp/descriptive_name.XXXXXX わかりやすい名前で一時ディレクトリを作成し、そこにあるすべての一時ファイルを処理し、その後で一時ディレクトリをrm -rします。
Ryan Thompson

わかりやすくするために、 すべて 次のように指定して、ディレクトリ内のwmaを指定します。 *.wma コマンドラインでは、確かに以下のような小さなリストでうまくいくでしょう。 1.wma 2.wma 3.wma 4.wma (5.wma、6.wma、7.wmaを除外する) *.wma
quack quixote

回答:


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を使用してください(これはmplayerが終了する可能性がある問題を回避するのに役立ちますが、これが起こったときにoggencが完了したと考えるのを防ぎます)。
  7. mplayerを使ってソースファイルからオーディオをデコードします。オプション -really-quiet -slave -nolirc メッセージを無効にし、キーボードやリモコンを読み取らないようにするためにあります。オプション -vc null -vo null ビデオのエンコードと出力を無効にするためにありますか。の -ao optionは、WAV形式のオーディオを名前付き書き込みパイプに出力するように指示します。
  8. 前のコマンドの実行中に、oggencを使用して名前付き読み取りパイプからOggに同時にエンコードします。
  9. 名前付きパイプを削除します。

改善するために左に詰め込む:コマンドの1つが失敗した場合にスクリプトを早く終了させる(使用 set -e )、しかしfifoを適切にクリーンアップします(必要なシグナルをトラップします)。


唯一の「わずかな」問題は、ファイル間にクリック音があることです。
hasen

@ hasen j:完璧なら、Audacityか他のwav-editorを使ってください。クリックの原因を突き止めることができれば、犯罪者にバグレポートを提出することができます。
quack quixote

15

SoX コンパイル対象のライブラリに応じて、多数のオーディオフォーマットを処理でき、単純なコマンドラインでファイルを連結できます。

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

私はこれがソースオーディオファイルがすべて同じチャンネル数を持っている場合にのみうまくいくと思うが、私はこれをテストしていない。

私の知る限りでは、SoXは.wmaファイルをまったくサポートしていないので、少なくともそれらのファイルを次のようなもので変換します。 ffmpeg 最初はおそらく避けられないです。

ffmpeg -i infile.wma outfile.wav

2
AFAIK soxは、すべてのファイルに同じチャンネル、サンプルレート、& Cがある場合にのみ機能します。ビット深度それ以外の場合は、すべてを指定する必要があります。私はそれがエンコードされたフォーマットもデコードすることに気づいていませんでした、しかし私はそれに追いついていないと思います。
quack quixote

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変換のためにlameをインストールする必要があります。 sudo apt-get install lame libmp3lame0

猫、それから変換はうまくいっていないようですが、ウェブ上にたくさんの参考文献があります。 cat *.wma | ffmpeg -i - -acodec ... - これは私のマシンでは動作しません - 最初のファイルだけが処理されます。 ffmpegには 'コピー'コーデックがありますが、大きな違いはありません。

最初にffmpegで変換を行い、次にcat * .ogg> output.oggは私のために働きました。


1
さて、連結についてはどうですか?
hasen

ごめんなさい!私の追加を読んでください。
DaveParillo

ffmpegについてはよくわからない... WMAデコーダとしては大丈夫だが、OGGエンコーダについての苦情はたくさんある少なくとも使う -acodec libvorbis エンコーダに内蔵されたffmpegを避けるため。
quack quixote

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ファイルが同じフォーマットでないと、コマンドは正しく機能しません。 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.