複数のオーディオファイルを連結して1つのogg(および/またはmp3)として出力するには、どのコマンドラインツールが必要ですか?
連結してoggに出力するための完全なコマンドを提供できれば、それは素晴らしいことです。
編集:入力ファイル(私の場合、現在)はwma
形式ですが、理想的には、さまざまな一般的な形式をサポートするのに十分な柔軟性が必要です。
Edit2:明確にするために、特定のディレクトリ内のallwma
sをマージしたくありません。 2つまたは3つのファイルを1つに連結したいだけです。
提案された解決策に感謝しますが、それらはすべて一時ファイルを作成する必要があるようです。可能であれば、それを避けたいと思います。
これが私の提案です:名前付きパイプに接続されたmplayerとoggencを使用します。
mplayer
を使用してオーディオをデコードします。さまざまなオーディオ(およびビデオ)形式を再生でき、複数のファイルを再生することもできます。
oggenc
を使用して、オーディオをOggVorbisにエンコードします。
一時ファイルの必要性を排除するには、 名前付きパイプ を使用してエンコーダーとデコーダーの間でデータを転送します。
それをスクリプトに入れる:
#!/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"
説明:
-really-quiet -slave -nolirc
は、メッセージを無効にし、キーボードやリモコンを読み取らないようにするためのものです。オプション-vc null -vo null
は、ビデオのエンコードと出力を無効にするためにあります。 -ao
オプションは、指定された書き込みパイプにWAV形式でオーディオを出力するように指示します。改善のために残されたもの:コマンドの1つが失敗した場合(set -e
を使用)、スクリプトを早期に終了しますが、それでもFIFOを適切にクリーンアップします(必要な信号をトラップします)。
ffmpeg を使用します。 wmaをoggvorbisに変換するには、次のようにします。
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が機能しました。
オーディオファイルを連結してトランスコードするには、次のワークフローに従います。
これらのステップでの処理は、WAVデータの連結を実行します。これは、処理が最も簡単で、損失が最も少ないものです。とにかくトランスコードしたいので、プロセスのどこかでWAVにデコードする必要があります。それを利用したほうがよいでしょう。
これが私がお勧めするステップです。デコードにはffmpeg
、連結にはsox
、エンコードにはoggenc
を使用します。他のツールを任意のステップに置き換えることができます--mencoder
やその他のツールはデコーダーとして正常に機能し、Oggをエンコードする任意のツールをエンコーダーとして使用できます-sox
よりも優れたツールを見つけるのは難しいと思いますが連結のために。
find *.wma -exec ffmpeg -i {} outfile.{}.wav \;
(これは、現在のディレクトリ内の各WMAファイルでffmpeg -i infile.wma outfile.infile.wma
を実行します)
sox outfile* all.wav
(注outfile
は、手順1で出力ファイルに付けたプレフィックスと同じです)
oggenc all.wav all.ogg
おそらくここでいくつかの品質設定が必要ですが、これにより適切な品質のデフォルトが得られます。 ffmpeg
で気に入った結果は得られませんでしたが、好むかもしれないので、以下にffmpegの例を含めました。
sox
コマンドは、すべてのWAVファイルが同じ形式でない限り正しく機能しないことに注意してください。たとえば、22kHzと44.1kHzの場合、コマンドラインスイッチを使用してそれらをsox
に識別し、どの形式を指定する必要があります。出力が必要です。連結ステップでsox
ほど機能するコマンドラインツールはありません。あなたcouldおそらくステップ1で生のPCM形式に出力し、ステップ2にcat
を使用しますが、それは同じ形式である場合にのみ機能し、非常に具体的にする必要があります。デコーダーとエンコーダーの両方が、どのフォーマットを期待すべきかについて。
Ffmpegでのエンコード:ネットの周りの多くの投稿は、ffmpegの組み込みのVorbisエンコーダーがあまり良くないことを訴えています。ご使用のバージョンがlibvorbisをサポートして構築されている場合は、代わりに-acodec libvorbis
を使用してください。サンプルコマンドライン:
ffmpeg -i all.wav -acodec libvorbis -ac 2 -ab 128k all.ogg
Mencoderは、一時ファイルなしでビデオを連結およびトランスコードできます( ここでの簡単な例 )。 aconvertと呼ばれるスクリプトが浮かんでいて、mencoderをだましてオーディオのみを実行させます(通常は実行を拒否します)。これら2つのことを組み合わせると、要件を満たすように見えます。
編集:私はaconvert.shを見つけました。残念ながら、それは1つのオーディオファイルを変換するように設計されています。しかし、とにかくここにコードがあります。誰かがそれを使用して、複数のオーディオファイルを変換するコマンドラインを作成したい場合に備えて。
#!/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
cat file list… | ffmpeg -f mp3 -i – -acodec copy outfile.mp3
MP3でうまく機能しました:他の形式でも機能すると思います。クレジットは Lindylex に移動します。
これは必ずしも必要なものではないかもしれませんが、役立つはずです http://bitzenbytes.com/index.php?name=PNphpBB2&file=viewtopic&t=6538&postdays=0&postorder=asc&sid=f87b364ddbae3ddd9417f5d10fae870c
私は自分の答えを投げ入れると思った。これはおそらく最もエレガントな方法ではないが、私が望んでいたことをした。
ステップ1:oggに変換します(mplayer
、pacpl
およびRuby
を使用します。これらはすべて無料のDebianリポジトリから入手できます。I)
#! /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