web-dev-qa-db-ja.com

WAVEファイルからVorbisストリームを抽出する方法は?

Vorbisストリームをoggコンテナに移動したいのですが、ffmpegがストリームを認識していないようです。

MPlayerは再生時にこの出力を提供しますが、次のようになります。

オーディオデコーダーを開く:[acm] Win32/ACMデコーダー
コーデックDLLのロード: 'vorbis.acm'
Loaded DLL driver vorbis.acm at 10000000
警告! ACMコーデックはsrcsize = 0を報告します
オーディオ:44100 Hz、2チャンネル、s16le、128.0 kbit/9.07%(比率:16000-> 176400)
選択したオーディオコーデック:[vorbisacm] afm:acm(OggVorbis ACM)

ffmpeg:

ffmpeg -i Source.wav -acodec copy Target.ogg
Input #0, wav, from 'Source.wav':
  Duration: 00:02:15.17, bitrate: 128 kb/s
    Stream #0.0: Audio: qg[0][0] / 0x6771, 44100 Hz, 2 channels, 128 kb/s
[ogg @ 00000000003096C0] Unsupported codec id in stream 0
Output #0, ogg, to 'Target.ogg':
  Metadata:
    encoder         : Lavf53.6.0
    Stream #0.0: Audio: qg[0][0] / 0x6771, 44100 Hz, 2 channels, 128 kb/s
Stream mapping:
  Stream #0.0 -> #0.0
Could not write header for output file #0 (incorrect codec parameters ?)

もちろん、これは必ずしもffmpegを介して行う必要はありません。実行可能な方法であれば問題ありません...


ファイルの1つを512KBにカットしました: sample.wav
(これを考慮して、ウェーブヘッダーの2つのチャンクサイズフィールドを変更しました。埋め込まれたストリームは「通知なしに」カットされます)

3
H.B.

WAVコンテナは、基本的に単なるファイルヘッダーです。 Vorbisで必要な可変長フレームはサポートしていません。 「OggVorbisACM」は、実際にはOggコンテナ内のVorbis(フレーミングを提供するため)であるため、必要なフレーミングをサポートしていない従来のWindowsACMオーディオフレームワークで使用できます。これにより、WAVファイルで使用することもできますが、代わりに.oggファイルを保存できるため、あまり意味がありません。

ffmpegは、この非標準の「OggVorbisACM」WAVコーデックを実装または認識しません。 Audacity など、これを認識するプログラムを使用することも、WAVヘッダーを削除して内部にあるOggVorbisを抽出することもできます。

有効なOggストリームはOggSで始まります。これは、ファイル内のすべてのOggページの始まりを示します。指定したファイルでは、最初のOggSの前に66バイトがあります。少なくともMac/Linux/Unixでは、次のコマンドで最初の66バイトを取り除くことができます。

tail -c +67 sample.wav > sample.ogg

ファイルには、埋め込まれたOggに実際には2つのストリームが含まれており、固定ビットレートにパディングしようとしているようです。 2番目のストリームには不明なコーデックがあり、一部のプレーヤーを混乱させているようです。たとえば、Firefoxは最初のストリームを再生しますが(2番目のストリームは無視します)、Chromeは2番目のストリームに遭遇すると停止します。また、eos(ストリームの終わり)がないなど、他の仕様違反もあります(おそらく、完全なファイルを投稿しなかったためです)。

最初のビットストリーム(vorbisのもの)を抽出すると、正しく再生されているように見えます。最初のビットストリームを抽出できるはずのツールを次に示します。

  • oggsplit (wavファイルまたはoggファイルのいずれかで機能します)
  • oggSplit from Ogg Video Tools (oggファイルで動作します)
  • oggz-rip (ただし、おそらく他の仕様違反のため、このプログラムはあなたのファイルを好きではありません)

AudacityのようなプログラムでWAVファイルを読み取り、それを再エンコードして、他の奇妙なものが含まれていないことを確認する方がよい場合があります。

3
mark4o

同じ問題が発生しましたが、多数のOgg VorbisWAVファイルを処理する必要があるという違いだけがあります。 Audacityはそれらの多くを開くことができませんでした(現在Audacityは コーデックID6771のOggVorbis WAVファイル のサポートを欠いています)、言うまでもなく、ファイルを再帰的にバッチ処理することはできません(チェーンの適用機能は単一ディレクトリ内のファイルに限定されています)。

結局、Ogg Vorbis WAVをより使いやすい形式に変換するための ogg_wav スクリプトを作成しました。スクリプトには多くのオプションとエラー処理があります。 Ogg Vorbis WAVを非圧縮WAV(_-c_オプション)に変換したり、プライマリOGGストリーム(_-e_オプション、オプションが提供されていない場合のデフォルト)を抽出したりできます。 Oggストリームのないファイルをスキップします。 _-d_オプションを使用すると、元の.wavファイルが削除されます。

これが最も単純な場合の動作です。ファイルにogginfoを含むOggストリームがあるかどうかを確認し、必要な書き込み権限があるかどうかを確認してから、最初の「OggS」マークを探し、moggsplitを使用してOggストリームの抽出を試みます。複数ある場合、再生可能な最大のOggストリームが必要なものであると想定しています。スクリプトはさらに複雑なケースも処理でき、多くのオプションがあります。_ogg_wav -h_を実行してすべてを確認してください。

使用方法の例をいくつか示します。まず、スクリプトをインストールする必要があります: download ogg_wav (Bash Shellが必要で、Linuxでのみテストしました)、実行可能にし(_chmod +x_を使用)、_/usr/local/bin/_。

Ogg Vorbis WAVをOGGに変換するには(複数のファイルを指定するか、_*.wav_のようなシェルグロブを使用することができます):

_ogg_wav ogg-vorbis.wav
_

上記のコマンドは、WAVファイルから再生可能な最大のOGGストリームを抽出することにより、ogg-vorbis.oggを作成します。

多数のファイルの場合は、GNU parallelを使用することをお勧めします。これは、Ogg Vorbis WAVを圧縮されていないWAVに再帰的に変換するコマンドです(バックアップを保持する場合は、_-d_オプションを削除してください)。 .wav拡張子を.bakに変更することによる元のWAVファイルの作成):

_find DIRECTORY -type f -iname '*.wav' | parallel ogg_wav -cd '{}'
_

このスクリプトは、Oggストリームが含まれていないWAVファイルをスキップするため、同じフォルダーに非圧縮のWAVとOgg VorbisWAVがある場合でも使用できます。

0
Lissanro Rayen