Opusを利用できるようにしてみた

というわけで結局Opusを利用できるようにしてみました。が、紆余曲折ありまして・・・

 

そもそもOpusとは?

Wikipediaで調べれば一発なのですそれだとおもしろくないのでこちらでちょっと解説。

Opusとは音声コーデックの一種で基本的に低遅延を売りにしている(ある程度)新しいコーデックです。音楽用というよりは音声用で特にボイスチャットなどで使うととてもよいコーデックで一部の音声チャットでは標準のコーデックになっています。とはいっても基本は2つのアルゴリズム(SILK、CELT)をうまいこと選択することで低ビットレート時(音声パターン)と高ビットレート時(音楽パターン)の質の確保と低遅延を両立させる、というスタンスになっています。ビットレートなどの設定によっては両方が合成して使われることもあったり。そのため、標準のライブラリでもアルゴリズムが別々のライブラリとして構築でき、その後でOpusによって統合する、という状態になっています。

またコーデックの特徴として、

  • サンプリングレートは基本的に48kHz固定。ただ音声などの処理のため48KHzの整数分の1で扱うこともある
  • サウンドのチャンネル数は基本的に1(モノラル)もしくは2(ステレオ)だけ。(一応拡張はできる)

と音楽のコーデックとしてみるとかなり割り切った仕様になっています。音声のコーデックとしてみると全くといっていいほど正しいですが。

 

今現在でOpusを利用するのはVorbisを利用する感じでできる

 開発元が同じになっている影響なのかOpus単体で扱う場合のコンテナはOggを使います。また、本家のソースコードがあるページにはopusfileというライブラリが公開されていて、これがVorbis側でいうlibvorbisfileとかなり似た実装になっているので一度libvorbisfileでライブラリを組んだことがあればさほど迷うことなく組むことができます。opusfileを使うにはilboggおよびopusライブラリ本体が必要になります。またopusfileにはストリーミング系の処理が可能になるように組まれているのでOpenSSLのライブラリを追加するとそういう使い方もできますがゲームライブラリレベルでそれは行き過ぎですか。

opusのライブラリ単体で処理を組もうとするとoggコンテナ処理が必要になるのでとんでもなく面倒です。実はTheoraの時に組んだライブラリを使ってoggコンテナ処理を自前でやろうかと思っていたのですが面倒で少し探したらopusfileが見つかったのでそちらに乗り換えた次第だったりします。

 

通常のサウンドとしては再生できるようになった

libvorbisfileの変形なので組み込むのは難しくはなかったです。問題なのはWebMのサウンドラインにOpusを使った場合の処理。うまく動かなくて数時間悩みながら調べた結果、どうもGoogleが公開しているWebMのSplitterのコードはVP8+Opus+mkvという状態を受け付けないらしく、そもそも読み込めない、ということが判明。VP8/9+Vorbis+mkvなら普通に読み込んでくれるのに・・・。OpusをDirectShowのFilterとして実装したときのテストはVP8+Opus+mkvの組み合わせを正しく読み込んでくれるSplitterを使ってSeekingのテストまで完了させたのでまあ封印指定ですかね。Opusを組み合わせても読み込めないのであればMovieLayerPlayerやDirectShow Extend Filter Libraryは更新できませんからね・・・。

 

デバッグの段階でVisualStudio2010のコンパイルオプションやらに苦労させられた

VS2005でもありましたが、特にデバッグビルドのライブラリとリリースビルドのライブラリを混合してデバッグに持ち込むとエラーになるのがきつい。特に_ITERATOR_DEBUG_LEVELという定義が非常にやっかいであることが判明してこの定義を各ライブラリプロジェクトに挿入して回ったのが大変でした。たぶん普通にデバッグをするのであれば_ITERATOR_DEBUG_LEVELはデバッグビルドであっても0にしておくといいと思います。一度必要なプロジェクトに定義を挿入してしまえばディレクトリ内の一括置換で変えることができるのでそれくらいはやっておきましょう。

 


コメントを残す

メールアドレスが公開されることはありません。

*

この記事のトラックバック用URL