AACデコーダ、撃沈

最近、コーディングを止めていたAndroid用のミュージックアプリの作成を再開しようと思った。

AACファイルのデコードにNATIVEコードでFAAD2を使っていたのだが、エミュレータでは速度がでない。再生速度可変の環境で速度を落としているような状態で聴こえる。使い方が悪いのかもしれないが、最初の30秒から1分くらいしか再生できない。

そこで、新たなサンプルを探した。見つかった。FAAD2、FFMPEG、OpenCOREの3つのデコーダを試して、パフォーマンスチェックをして、サンプルアプリをソース付きで公開しているのが見つかった。しかもAAC用!

ということで早速実験。の前に、そのサンプルについて簡単に解説。

FFMPEGについては私は使っていないので割愛。FAAD2については、このサンプルの作者によれば実機では普通に再生できたらしいのだがエミュレータではゆっくりした再生になってしまったとのこと。OpenCOREではその問題が解決できたとのこと。素晴らしい。それなら、このサンプルを動かして、OpenCOREを使うように自作アプリを作りなおせばいい。ライセンスも問題ない。

で、今日、makeしてエミュレータで動かした。makeはWarningが出たもののエラー無し。文句ないレベルだ。しかし、ファイル指定ではなく、URLでリソース(ファイル?)を指定して再生するようになっている。まぁ、URL形式であっても、file://で始めればローカルファイルを指定できるから、エミュレータのSDカードに入れてある自作アプリのテスト用のファイルを読ませられるはず、と思ったのだがうまくいかない。

で、ソースを読んだ。うまくいくはずがなかった。

このアプリは、ネット上のAACストリーミングを再生するのに特化したアプリなのだ。AACファイルというと私にはiTunesの標準エンコーダのイメージが強いのだが、実際にはそうではなくて、音声ストリーミングのエンコード形式として使われることが多い。YouTuneのflv形式動画の音声もAACファイルとして分離できる。

で、この両者のヘッダ形式が違う。ADTS形式とMP4コンテナ形式。FAAD2のソースを読んだ時には入り口が明確に異なっていた。ソースの最深部でどこまで異なっていてどこまで共有化しているかまでは読み込んでいないが、ビットレートやサンプリングレートなどをデコーダが取得する場合に読み込むヘッダの形式が根本的に違うように見えた。

で、このサンプルはストリーミングを対象にしているから、アプリの入り口はADTS形式のAACソースしか対象にしていない。私のアプリはiPod互換を目標にしているから、MP4コンテナ形式のAACファイルが再生できなければいけない(というかiTunesでエンコードするとこっちになるというのは実験でわかっとことで理由は知らない)。

FAAD2の入り口はすでにソースを読んでいるからだいたいわかるので、それとの比較でOpenCOREのソースを読んで、削られていなければMP4コンテナ形式のAACデコーダの入り口を見つけてエントリポイントを作ればいい。オリジナルソース全部+パッチになっていることを祈る。

コメント