ffdshow で S/PDIF から Dolby/AAC のビットストリームを出力

前口上をいろいろ考えたけど長くなるので割愛。何が目的でこういうことやってるかわかる人へ。

きっかけ

  • 前からコンポのスピーカーで音楽聴く派だった
  • DVD の 5.1ch って面白いよね
  • PT1 買った
    • デジタル放送の音声は AAC
  • 自分のPCには S/PDIF (TosLink)が付いてる*1

外部コンポに Dolby/AAC デコーダーが付いてればビットストリーム出力してやってそっちで鳴らせばいいんじゃね?

しくみ

PT1 関係の再生アプリにしろ、DVDの再生(もっぱら WMP)にしろ、音声は DirectX フィルタ(今回は ffdshow)を経由するので、Dolby/AAC のデータを S/PDIF にパススルーするように設定。どうやら AAC の信号をリアルタイムに Dolby 信号に変換して出力してるっぽい。ffdshow は clsid による開発版を使ってるけど、ベータ版でもいいと思う。適当に。同様のことは AC3Filter でも可能。

  1. AAC, AC3 のコーデックを有効(libavcodec/liba52)に設定
  2. ミキサー設定を有効化し、出力スピーカーの設定を「入力と同じ」に
  3. 出力先の設定で、 AC3/DTS のパススルー出力を有効化
  4. 同じく出力先の設定で「サポートされた出力サンプル形式」の項目で「AC3(S/PDIFエンコードモード)」を有効化。5.1ch のみエンコードにチェック入れると 2ch 音声がそのままスルーされないので、そこはチェック入れない。ビットレートは適当に最高値(640)でいいと思う。32bit Integer/Float は通常通り有効に。
  5. その下、接続先を「フィルターすべてに」もしくは「DirectSound」で。通常は「フィルターすべてに」で問題ないはず。

これで DVD や AAC ファイルを再生すると、 Dolby 信号に変換されて光出力経由で出力されるため、外部コンポ側のモードで確認できる。ffdshow の情報とCPUページで出力情報に「S/PDIF」と出ていれば大丈夫。

なお、ボードや外部アンプによってはサンプリング周波数が特定の値で無ければ受け付けず、自動的にPCM出力となってしまう場合があります。アンプが44.1kHzを受け付けてもボードが48kHzのみ対応だと48kHzでサンプリングされたファイル・信号しか受け付けられません。この場合、ffdshowのリサンプリングの項目でサンプリングレートを指定し、一度デコードしてからリサンプリングしてやる必要があります。

あと、ドライバ側での設定も必要なボードの場合は、マニュアルやドライバヘルプに従ってください。そうじゃないと出力されない場合があります。

Windows 7対応

追記しました。詳細は ffdshowのインストールと基本的な設定、使い方 | OSDN Magazine を。
Win7/WMP12 では MS 純正デコーダを優先的に決め打ちで使ってしまうので、意識的に AAC のみ ffdshow を通すように設定する必要があります。

このMS純正デコーダ、案外というか意外に高性能なので、完全に無効にするのはもったいない。なので、 Win7DSFilterTweaker の1ページ目のコーデック別設定と2ページ目の Media Foundation で再生させたくない項目で AAC/mp4 を決め打ちしておけば、 Microsoft DTV-DVD Audio Decoder や Media Foundation を無効にする必要はないです。

*1:付いてなくてもジャンク屋で探せば数百円で拡張ボードを買えたりできますが。アナログボードと違い、単にデジタル信号を光に変換するだけでいいので、アナログボード全盛時のようにボードの違いによる音質(笑)の変化まで気を巡らせなくてすむのが楽。