2014年3月20日木曜日

曲の再生


Androidで音楽再生をしていて一番最初に気になったのが再生中に途切れることでした。
youtubeや動画再生では途切れることが無かったので何故だろうと直接的な原因がはっきりしません。

一般的な概念から整理すると、音の再生は無圧縮状態で高ビットレートにすればするほど負荷が高くなりストレージやメモリー転送レートの限界を超えると基本的には音飛びや途切れが発生します。
圧縮されているものでは高ビットレートにすればするほど負荷が高くなるのは当たり前なのですが、圧縮されている分ストレージなどの補助記憶装置からの転送レートを超えることができます。
しかしながら展開アルゴリズムがハードウェアレベルで実装されていない場合や複雑なアルゴリズムが必要な場合はそれなりの展開時間がかかるようになります。
ハードウェアやソフトウェアで展開アルゴリズムを実装する場合にはある程度の誤差や機能を切り捨てて高速化する手法が取られることも少なくありません。

ソフトウェアレベルの話になると、短時間(数秒もの)の再生以外は物理的にメモリー上に再生バッファを持ってそこから再生するわけですが、この再生バッファの大きさが足りない状況では簡単に再生の音声が途切れることになります。
再生バッファの大きさはOSの制約やハードウェア、ドライバに依存する部分が高く、一般的に普通に使っていて音切れや音飛びが発生する場合は使用時の処理負荷が高くなった時に発生しやすくなります。

こんなところが一般的な話ですが、Androidの話に戻すと音声ファイルの再生に関して一般的な再生コーディックは大抵ハードウェアレベルで実装されているようですが、機種によりさまざまな実装が行われているようです。
ハードウェアで実装されていない場合はソフトウェアによる実装しか方法は無いのですが、どうもWindowsのようなコーディックを単純にインストールすれば再生できるようになる訳ではないようで再生アプリケーションに頼るしかないようです。

最初タブレットで音声ファイルを再生しようとした時に、タブレットではほとんど手持ちのwmaファイルがほとんど再生できなく、あきらめてファイル形式を変換するしかないのか?というところから出発しました。
あきらめているさなかに、試しに携帯で再生してみるとそのまま再生できることがわかりました。実際に再生ができるようになると、今度は再生中の音切れが気になりだしました。
様子を見ながら再生していると、だいたい1~2分で1回音切れが発生する感じでした。一曲5~6分のものが多いので一曲あたり2、3回発生することになります。
(実はこの手の再生時の音切れはWindows Mobileでも発生することがありました。S21HTでOSのアップデートやパッチで頻度は減るようになったもののどうしても音切れがあり、その際に標準のプレーヤではなくTCPMP(The Core Pocket Media Player)を利用した経験があります。
さらにそれ以前ではHPのPDAでWindows Mobile 2003 Second Editionでは最初はまったく問題が無かったのですが、ファームウェアアップデートでOSのバージョンを上げた後、音楽再生で音切れが発生するようになったり、再生が途中で止まるようになったりといろいろと不具合がありました。)

ようやくここでAndoroidでもこの手の問題が一般的で、みんなは標準的なプレーヤーを捨ててメジャーなアプリで再生しているのかもしれないと考えるようになりました。(今更的な発想ですが(笑))

いろいろと検索したり試した結果、やはりプレーヤーをかえるといくらかましになるものもはありましたが、なかなかきれいに再生してくれるようなものは見つかりませんでした。
Windowsで有名なWINAMPがその中でも結構軽く作られているようでよかったのですが、音切れがなくなることはありませんでした。(しかも見つけたときはちょうどAndroid版の開発中止が発表されました)

ほとんどのプレーヤはUI部分のみ作成されていて肝心の再生部分はAPIレベルでの再生を行っているだけのものが多く、ハードウェアで実装されていない圧縮形式のファイルを利用することはできません。
どうせならタブレットでも再生できるものが無いのか調べて見るようになり、ソフトウェア側で直に圧縮されたものを展開しているものはないかと探してみました。
そして見つけたものがVLCというものでした。VLC自体はオープンソースのようでいろいろなバイナリーがリリースされているようで、私が利用しているものはVLC for Android v0.1.4というものです。
確かにタブレットでもwmaファイル(可変圧縮のもの)でも再生できるようになりましたが、残念なことに音切れどころか再生直後から音が飛でしまいとてもガッカリしましたが、設定項目を見ていくうちに高度なデバッグ→オーディオ出力という項目が目に付きました。
説明に「オーディオ出力に使用するメソッドを変更します。」とあります。
実際に見てみると
  • AudioTrack(Java)
  • AudioTrack(ネイティブ)
  • OpenSL ES
と3種類の出力方法があるらしく、最初は「AudioTrack(Java)」になっているのですがこれを「AudioTrack(ネイティブ)」に変更したところ劇的に再生がスムーズになりました。


音楽再生は現在でもこのVLCをメインで使っています。

しかしAndroidは見えないところでアプリが頻繁に入れ替わり立ち代り起動しているのでインストールしているもので足を引っ張るものが数多くVLCを使っていても音切れは発生してしまいます。

原因はAndroidの仕組みがそうなっているので仕方がない部分もあるようですが、できる限りスムーズに再生してくれるものがあるといいのですが。
Androidのバージョンもどんどん上がっているので上位になれば改善するのでしょうか?

0 件のコメント:

コメントを投稿