2011年8月29日月曜日

MediaPlayerでStreaming的な再生 その1

作成中のアプリですが、
現在一応音楽ファイルを再生できる、と書いてましたが、
PC側からファイル全体をダウンロード完了しなければ
再生が始まりませんでした。
で、今回なんとかダウンロード途中で再生ができるように
かなり強引にやってみました。


Androidで音楽ファイルは
MediaPlayerを使うことで簡単に再生することができます。
さて、このMediaPlayerでは、

・ファイルパス
・ファイルディスクリプタ(javaのクラス)
・URI

がsetDataSourceで入力として使えます。
どのバージョンのAndroidからかは忘れましたが、
3番目のURIで、入力値として、
httpで音楽ファイルを指定すれば
ストリーミング再生が可能みたいです。試してないですが。

今回、ダウンロード先が自作の独自のJavaで作成しているサーバのため、HTTPプロトコルではなく、
SocketのgetInputStream/getOutputStreamから
ObjectInputStream/ObjectOutputStreamを生成して、通信を行っています。

そのため、
while ((c = inStream.read(buff)) != -1) {
os.write(buff,0,c);
os.flush();
}

のようにして、読み込みを行ってます。
HTTPリクエストに対してレスポンスを返すようにサーバサイドを作り変えれば簡単かもしれませんが、他のディレクトリ構造の情報とか画像とかをやり取りするため、
サーバサイドはObjectStream系のreadObject()で読み込み待ちをしています。
そのため、setDataSourceでサーバのアドレスをHTTPプロトコルで入力してやると、例外が吐かれてしまいます。

ので、上のようなbyte読み込みで、Streaming的に再生ができないか色々と試行錯誤しました。



1.setDataSourceで指定したファイルに対して、追加で書き込みを行う

まず最初に考えたのが上の方法です。
これは、
File.createTempFileで一時ファイルを作成。
FileOutputStreamで音楽ファイルの先頭のある程度のバイト数を書き込む。
FileInputStreamで同ファイルを開き、setDataSource(inputStream.getFD())で指定して、再生を開始。
通信で追加のデータを受信する毎にこのファイルに対して書き込みを行えば再生されないかなー?
ということです。
setDataSource()では、ファイルロックがかかってないので、書き込み自体は、可能でしたが、肝心の音楽の再生がsetDataSource()時点で書き込まれているところまでしか、再生してくれませんでした。

失敗です。。。

続きます。

0 件のコメント: