SSブログ

5.1chのAACをWAVEにする [ソフトウェア/PC関係]

デジタル放送教科書〈上〉MPEG‐1/2/4~H.264/AVC (インプレス標準教科書シリーズ)
MPEG TSの構造などが載っている本。高いんだけど,Googleのブック検索でも結構読めちゃったり...。

WOWOWを録画したMPEG2 TSファイルを,圧縮保存する手順が未だ確立せずに,悪戦苦闘中。問題なのはHD放送で使用されている5.1ch音声。AACという圧縮方式なのだが,ペガシスのTMPGEnc MPEG Editor 3(TME3)は,5.1ch AACをサポートしていないので,映像は編集できるが,音声が編集できない。こいつが5.1ch AACをサポートしてくれれば何の苦労もないのに。

仕方ないので,音声だけ分離して,他のソフトで処理することにした。ところが分離したAACファイルが,何故かことごとく2chと認識されてしまう。気になるのでAACファイルの中身を調べてみた。AACファイルのフォーマットは,ISO/IEC 13818-7という規格で決められている。これによると,AACファイルはADTSフレームの集合体である。1つのADTSフレームには,音声1024サンプル分のデータが含まれている。それぞれのフレームは独立しており,チャンネル数が違ってもいいらしい。なるほど,それが原因みたいですな。チャンネル数などの情報は,各フレームのヘッダに含まれているので,先頭から順にADTSフレーム・ヘッダをチェックすれば,どこでチャンネル数が変化しているのか分かるわけだ。ところが,このADTSフレームのサイズは可変で,かなり深くまでADTSフレームの中身を解析しないと,サイズが分からないみたい。これが分からないと,次のフレームが見つけられないわけだが,各フレームのチャンネル数が知りたいだけなのに,そこまで解析するのはさすがに面倒くさい。

TSファイルの中では,AACはESとしてPESパケットに入れられた後,TSパケットに分割されている。もしかして,PESパケットってADTSのフレーム毎に分割されているのでは? と思ってTSファイルを調べてみたらビンゴだった。つまり,TSファイルのレベルなら,ADTSのフレーム・ヘッダを探すのは簡単ということ。早速テスト用のプログラムを作ってみた。ADTSフレーム・ヘッダは,PESパケットの先頭を含むTSパケットに含まれているはず。したがって,ペイロード・ユニット・スタートのビットが立っているTSパケットを探せばよい。結果として,最初の方に2chのADTSフレームがあり,途中で6chに変わり,最後また2chに戻っていることが分かった。何のことはない,番組の前後に余裕を持って録画した部分が2chだったのである。誤認識したプログラムは,先頭のADTSフレームだけ見て,2chと認識したのだろう。まぁ仕方のないことではあるが。

それなら6chの境界で,元のTSファイルを分割すればよいわけだ。ここで配布されている,tssplitterというツールのドキュメントによれば,-SEPAというオプションを指定すると,音声チャンネルが切り替わったところで分割してくれるらしい。...のだが,何故か私の所では何もファイルが出力されないし,エラー・メッセージも出ない。ググってみたところでは,ちゃんと使えている人が多いようなので,私の環境がツールの想定しているものと何か違うのだろう。tssplitterにはソース・コードが付属していないので,原因を特定するのはなかなか難しい。仕方がないので,自前で作ることにした。TSファイルで出力しても使い勝手がよくないので,MPEG2映像とAAC音声として分離する。これは,TSパケットからPESパケットを取り出し,ヘッダを取り除いたものを単純に連結すればいいだけなので簡単。但し,分離してしまうと映像と音声の同期情報がなくなるので,開始位置を合わせる必要がある。これは,PESヘッダにあるPTSを元にして,音声の開始PTSに一番近い映像から切り出せばよい。基本的にAACのPESは,どこから切り出しても問題ないはずだが,映像の場合,何フレームかの単位で依存関係があるので,その切れ目を知る必要がある。これは,TSパケット・ヘッダのアダプテーション・フィールドにある,ランダム・アクセス・フラグをチェックすればよさそうだ。AACは1フレームが1024サンプルなので,48KHzの場合で約21ミリ秒。うまくやれば,10ミリ秒程度の精度で映像に合わせられる計算になる。映像が1フレーム33~40ミリ秒程度なので,事実上問題のない誤差といえる。

こうして抽出・分離したファイルを,Media Player Classicで再生してみると,番組前後に数フレーム余分な映像が入る(MPEG2の構造上しかたがない)ものの,ほぼぴったり抽出できていた。映像と音声の同期もぴったりだ。ここまでは順調。

次なる問題は,5.1ch AACをどうするかということ。映像はDivXで圧縮し,AVIファイルにしたいのだが,普段使っているツールでは,AACをAVIファイルにMUXすることが出来ない。他にそういうツールがあるのかもよく分からない。世間的には,5.1ch AACを,5.1ch WAVE(PCM)を経由してAC3に変換するのが主流のようだ。AC3ならMUXできる。で,まずはAACをWAVEにするところからはじめた。AACのデコーダとしては,フリーのFAADがメジャーらしい。ところが,さっそく使ってみると,元のAACが2時間14分ほどあるにも関わらず,出来たWAVEファイルは2時間4分しかない。これは一体どういう事?

しばらく悩んだ揚げ句,ようやく気付いたのは,できあがったWAVEファイルのサイズが4Gバイトを超えていること。考えてみたら,WAVEファイルのRIFFヘッダにあるサイズ・フィールドは4バイトしかないので,4Gバイト以上のWAVEファイルはサポートできない道理だ。実際,ヘッダにはサイズが0xffffff00なんて書いてある。おやおや。でもまぁファイル・サイズは4Gバイト以上あるので,変換だけは全部されているっぽい。プレイヤは,ファイル・サイズを見て,4Gバイトより後ろをゴミだと思ったのだろう。いずれにしろ,AC3にするために,WAVEをチャンネル別の6つのファイルに分割する必要があるので,そうすれば4Gバイト超えの問題は解決できるはずなのだが,分割に使うBeLightというツールが,サイズ・フィールドに騙されてうまく分割できない。これまた自分で作らないとダメか...。

まだまだ先は長そうだ。


nice!(0)  コメント(2)  トラックバック(0) 

nice! 0

コメント 2

ブギーダウン

はじめまして。 ブギーダウンと申します。
今TSファイルの音声を分離しようと四苦八苦してます。
検索後、ここに流れ着きました。
コマーシャルのステレオと、本編のモノラル?を分離したいのですが、
PMTからAACのESまでたどり着きましたが、そのESの構造が
よく分からず難航しております。
ESのTOPは、PESフォーマットということは理解したのですが、それ以降はどうなっているのでしょうか?
ESの中のどこにステレオなどの情報が書かれているのか知りたいので、
ES構造が書かれているHPや情報など教えて頂けるとありがたいです。
突然の書き込みで失礼しました。
by ブギーダウン (2012-06-23 12:55) 

Hiro

済みません,だいぶ前の記事のことなので,記憶が薄れ,資料も散逸しています^^; ちょっと探してみますので,お急ぎでなければお待ち頂ければと思います。
by Hiro (2012-06-27 23:08) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

増刷御礼5.1ch WAVEのチャンネル順 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。