再生できない番組がある

ガラポンTVのWebのプレイヤーと同じように、2か国語音声がある動画で主音声と副音声を切り替えられるようにしようと思ったがAndroidFlashでは無理っぽい? Sound の setPan() とか setTransform() を使ってみたが効果なし。setVolume() くらいしか動いてくれない。
Android側でどうにかできないかと思って調べてみたけど無理そうですな。VideoViewで再生するときは左右の音量を切り替えられるが、試した限りでは2か国語の音声がある動画はそもそも MediaPlayer がクラッシュしてしまいまったく再生できず。

ダウンロード

ファイルのURLをそのまま Android の DownloadManager に渡すという手抜き実装をしていたが、どうもこれだとガラポンTVに激しい負荷がかかるらしく、サーバが応答しなくなったり、ダウンロードに失敗したりでひどいらしい。
m3u に書かれている通り、5秒刻みのリクエストを順番にやっていけば問題なさそうだった。
4時間30分のデータをWiFiでダウンロードした場合、ダウンロードかかる時間は25分で合計のファイルサイズは 826MB だった。

Flashでの再生時にもシークバーが使えるように


Flash使用時はガラポンTVデフォルトのメディアプレイヤーを使っていたんだけど、これがJavaScriptから再生位置や長さを取得することができず、いろいろ不自由なところがあった。
今回メディアプレイヤーを別のものに置き換えたのでいろいろ自由になった。
前回の続きから再生したり、字幕と再生を同期させたり、字幕からシーンサーチすることもできそうな感じ。(いまのところ全部未実装w)


オープンソースでカスタマイズ可能なちょうどいい感じのメディアプレイヤーを探すのと、ローカルのswfからインターネットのデータを読ませるのにかなり手間取った。
swf を file:///android_asset/ や content:// から読ませると、サンドボックスの制限か何かでインターネットにアクセスできないみたいで。
結局、swf はインターネットに置いてあるように見せかけておいて、実際には WebView#shouldInterceptRequest でローカルのリソースを読ませるようにして解決。

再生履歴

番組を見たかどうかの記録が残らないのがちょっと不便だったので記録を残すサーバを立てた。
ユーザの識別にはGoogleアカウントを使うことにした。
認証して取得したメールアドレスのハッシュをID扱いに。
ガラポンTVのアカウントを貰えばいろいろできるし楽なんだけど、そういうデータにはあまり関わりたくないですな。

ダウンロード

むかし2chのスレかどこかで「MP4は保存できるけどTSは保存できない」みたいな書き込みを見かけた気がするけど、試したらあっさりできたので機能として追加。
ダウンロード速度がめちゃめちゃ遅いしワンセグ画質なのであまり意味はないだろうけど。
Nexus 7での再生結果。

  • BSPlayer
    • 動きはスムーズで、シーク、レジューム、再生速度変更も問題なし。ただしプチプチと音声にノイズが入る
  • MX動画プレイヤー
    • コマ落ちあり。シークできない
  • VLC
    • コマ落ちあり。シークできない