web-dev-qa-db-ja.com

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

複数のオーディオファイルを連結して1つのogg(および/またはmp3)として出力するには、どのコマンドラインツールが必要ですか?

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

編集:入力ファイル(私の場合、現在)はwma形式ですが、理想的には、さまざまな一般的な形式をサポートするのに十分な柔軟性が必要です。

Edit2:明確にするために、特定のディレクトリ内のallwmasをマージしたくありません。 2つまたは3つのファイルを1つに連結したいだけです。

提案された解決策に感謝しますが、それらはすべて一時ファイルを作成する必要があるようです。可能であれば、それを避けたいと思います。

10
hasen

これが私の提案です:名前付きパイプに接続された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"

説明:

  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. 名前付きパイプを削除します。

改善のために残されたもの:コマンドの1つが失敗した場合(set -eを使用)、スクリプトを早期に終了しますが、それでもFIFOを適切にクリーンアップします(必要な信号をトラップします)。

9

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

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

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

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

ffmpeg -i infile.wma outfile.wav
15
goldPseudo

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が機能しました。

3
DaveParillo

オーディオファイルを連結してトランスコードするには、次のワークフローに従います。

  1. 入力オーディオファイルをWAV/PCMデータにデコードします。
  2. WAVを連結し、
  3. WAVをエンコードしてオーディオコーデックファイルを出力します。

これらのステップでの処理は、WAVデータの連結を実行します。これは、処理が最も簡単で、損失が最も少ないものです。とにかくトランスコードしたいので、プロセスのどこかでWAVにデコードする必要があります。それを利用したほうがよいでしょう。

これが私がお勧めするステップです。デコードにはffmpeg、連結にはsox、エンコードにはoggencを使用します。他のツールを任意のステップに置き換えることができます--mencoderやその他のツールはデコーダーとして正常に機能し、Oggをエンコードする任意のツールをエンコーダーとして使用できます-soxよりも優れたツールを見つけるのは難しいと思いますが連結のために。

  1. find *.wma -exec ffmpeg -i {} outfile.{}.wav \;
    (これは、現在のディレクトリ内の各WMAファイルでffmpeg -i infile.wma outfile.infile.wmaを実行します)

  2. sox outfile* all.wav
    (注outfileは、手順1で出力ファイルに付けたプレフィックスと同じです)

  3. 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
3
quack quixote

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
1

.oggファイルでは機能しませんが、 mp3wrap は複数の.mp3ファイルを1つのファイルに連結できます。したがって、コマンドラインから次のようなことができます

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

これは ffmpeg を使用してすべての.wmaファイルを.mp3に変換してから、すべての.mp3ファイルを1つのファイルにマージします。

1
goldPseudo

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

0
alpha1

私は自分の答えを投げ入れると思った。これはおそらく最もエレガントな方法ではないが、私が望んでいたことをした。

ステップ1:oggに変換します(mplayerpacplおよび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
0
Inaimathi