Monday, June 2, 2014

GoogleDriveのRange指定がちゃんと動かないのはもしかして、、

長らくGoogleDrive上のファイルでRange指定をするとフリーズしてしまう問題で苦しんでいるのですが、問題の起きているファイルには特徴があることがわかりました。

まず、ファイルのサイズが大きすぎる件。
テストで使用しているファイルは再生時間が1時間以上のファイルです。
長いもので2時間超の音楽ファイルなのですが、これらのファイルはローカルでは正常に再生できています。
ストリーミング再生でもRange指定で簡単にシーク位置まで移動してくれるものとおもっていたのですが、どうやら、これWebサーバーによってはうまくいかないのかもしれないです。というのも、これDropboxやAmpacheでは経験してないんですよね。
ちなみに、フリーズしている箇所はGoogleDriveAPIのHttpRequestに対して、Executeを実行している箇所です。

Range指定をした場合は、ときどきこの場所でフリーズするんです。
うまくいく場合もあります。これが謎、なのですが。

うまくいく場合は、一発目に限るです。
一度再生用のストリーミング処理をしている最中に、Range指定をするとフリーズします。
この流れですが、MediaPlayerによって再生中のコネクションを切断するのは、Range指定されたリクエストが発行された後のようなので、これが問題になっているのかもしれません。

あと、プログラム側でも考慮するべき箇所がありました。
JUST PLAYERでは状況を把握するために定期的に isPlaying や getCurrentPosition、 seekToなどを行っています。
これ、Prepareされるまえに呼ばれる可能性がありました。
さすがに seekToはなさそうですが、 isPlayingや getCurrentPositionなどは状況をチェックする際に呼ばれます、この処理のためにRange指定のリクエストがどうやら動いているようなんですね。
てことは、頻繁にリクエストが発生すると、GoogleDriveは短い時間の間に何度もリクエストがくるとエラーを返すようなので、これはまずい感じがします。
ですので、とりあえずPrepareが終わってない場合は0なりFalseを返すなりの処理にしておきました。

このような処理をすることで少しは動作が安定したようにみえます、曲の選択でも簡単にフリーズしていたけど今はそれほど問題はおきていません。
もちろん、長いファイルの曲の移動では問題がおきていますので、これは今後の課題になりそうです。

下記のリンクは現時点の最新モジュールです。
シャッフルのロジックの修正、上記問題の修正、MimeType読み込みの修正、MinSDKを14にするといった修正がはいっています。
あと、共有ドライブの機能は動作が確認できたので一旦無効にしています。
(共有ドライブのリスティングが遅いので、テストだとイライラするため、これは将来オプションですね。)

https://bitbucket.org/yokmama/just-player/downloads/JUSTPLAYER3_v1.0_060201.apk

#口調が砕けてきて読みにくい文章になりつつあります。すみませーん。


No comments:

Post a Comment