2013年10月28日月曜日

OpenSL for Android で困ってること

OpenSL for Androidで困ってることをいくつか。
全部、デコードするときの問題です。直接再生する時は違うのかもしれない。

1.VBRのmp3ファイルので、シークが正確でない。
VBRのmp3ファイルのシークの精度が悪い。平気で数秒程度ずれる。
わかりやすい例であh、曲の終わりにシークさせて再生させても、平気で曲長を越えて2~3秒くらいは再生する。
OpenSLを使ってる他のプレーヤーアプリでも同じ現象が確認できるから実装の問題ではないと思う。

対策は・・・今のところみつかってない。
英語で検索してもそれらしい事を言っている人を一人も見ないのは、大した問題では無いからなのだろう。自分が作っているアプリの場合は、これが致命的になるケースがあるので困っているのだが。

2.Galaxyシリーズでのモノラル音声の再生が怪しい。
どう怪しいかというと、普通の端末ではモノラルサウンドでは1チャンネル分がデコードされるのだが、一部のGalaxy端末では、2チャンネル分のPCMが出力される(サンプリングレートが倍になってるのと等価)。
結果的に半分の速度でスロー再生しているような音声が再生されてしまう。
困ったことに全てのGalaxy端末で発生するわけではない。

解決策としては、モノラルのサンプルデータを仕込んでおいて、アプリの初回起動時にデコードサイズが想定されるサイズになるか、倍のサイズになるかを調べれば良い。
倍のサイズになった場合は、常にステレオ音声として再生させれば良い。

これでOK.

・・・・と、思うじゃないですか。
実際にこれでGalaxyS3ではこれで回避できたし、
友人のGalaxyS2( 日本で最新の4.0.3 )でもこれで回避できた。
が、4.0.4なGalaxyS2をお持ちの海外ユーザーさんからは相変わらず直らないとの声。
手動でステレオモードに切り替えてもらったら正常に再生されたそうなのだが、ログを送ってもらうと、デコードサイズは通常サイズ。
正直何がなんだかよくわからない。

4.0.4なGalaxyS2が手に入ったらもう少し追ってみたい。
か、誰か答え知ってたら教えて下さい。