ドワンゴインターンで作ったもの
■実装するためには?
- AndroidはH.264動画が再生可能、ニコ動はflv
- →変換サーバが必要
- ランキング取得には裏でしか使えないAPIを叩かなければならない
- →API中継が必要
- マイリスト取得にはuser_idが必要だが、クライアントには保存されてない
- →独自のセッション管理が必要
■バックエンド
●サーバ構成
サーバは以下の4台構成としました。 これはiPhone版ニコニコプレーヤの仕組みを参考にしています。
●infoサーバ
動画以外の情報を入出力するためのサーバです。 ログイン情報はニコニコ動画本家のログイン管理加え、 マイリスト等取得用に独自でセッション管理しています(Memcache使用)。 それ以外の、たとえばランキングや、動画情報の取得については、 内側でのみ使えるAPIをそのまま中継して使用しています。
●manageサーバ
ログイン情報用のMemcache、動画エンコード管理用のキューDBを ストアしておくためのサーバです。実運用においては、セキュリティを確保するために LAN内からのみアクセス可能としておきます。 本来、ログイン情報、キュー情報を管理するためのコンソールが必要ですが、 今回は開発時間が足りなかったため実装できませんでした。
●frontサーバ
エンコード済みの動画をAndroid本体に送信するためのサーバです。 動画リクエストを受けた際に、動画のエンコード状態をチェックし、 既にキャッシュ済みであれば、その動画のurlを返しダウンロードさせます。 未エンコードで、かつキューがない場合は、キューを作成して、クライアントにWAIT命令を出します。 エンコード済みであれば、convサーバからhttpで動画をロードして、 自urlをクライアントに返します。
●convサーバ
キューにたまっている動画をエンコードするサーバです。 処理は単純で、延々とキューを読み出し、愚直にエンコードしてゆくだけです。 エンコードが完了したらhtdocsに保存し、DBにエンコード完了フラグをセットします。
■バックエンド動作構造
■Androidソフトウェア部分の実装
●実装すべきもの
- 各画面UI
- http通信、xmlパース
- 設定保存
- 動画描画
- コメント描画
●動作フロー
- ログイン(未ログインの場合は設定画面へ)
- 各種動画一覧/設定
- ランキング
- 動画検索
- マイリスト
- 設定
- 動画選択
- エンコード状態取得
- WAIT→一定周期ごとに再アクセス
- READY→付随URLを元に動画再生スタート
- 動画再生
- コメント情報取得
- 動画のストリーミングはAndroidが勝手にやってくれる(VideoView)
- コメント描画
●ログイン
- 愚直に設定からアカウントを読み出し、httpsで投げるだけ
- アカウントはPreferenceに保存(Windowsでいうレジストリ)、自ソフトのみ読み出し可
- アカウントが保存されてないorログイン失敗なら設定画面へ飛ばす
●各種動画一覧取得(ランキング/検索/マイリスト)
- 中継サーバを使ってxmlで動画リストを取得
- サムネ取得&描画が遅いので、ハンドラを使って遅延描画
- マイリストは、セッションを渡して取得
●動画状態取得
- イライラさせないために「エンコーディングなう」の画像を真っ先に表示
- あとはStatus=READYの返答がくるまで、ひたすら繰り返し定期アクセス
●動画再生
- コメントのxmlをコメントサーバから取得(中継なし)
- 動画はVideoViewにURLを渡すだけで、勝手にストリーミングしてくれる。便利。
- タイマーを使って定期的に動画の再生位置を取得し、そこにあるべくコメントを表示
- コメントオブジェクトは使いまわし(当初はガベコレ)
- 衝突判定とかいろいろめんどくさい処理があるが、俺は担当してなかったのでわかんない。ふじこお疲れ。
■Androidソフトウェア開発のキモ
- 1ページ単位にActivityを作る
- ページ間をまたぐデータを送受信しあうためにIntentを使う
- UIはレイヤーのように重ねることができる
- (ニコ動プレーヤでは、下から動画、コメント、透明ボタン、制御ボタンの順にレイヤーを重ねた)
- VideoViewは便利、ストリーミングを扱うならこれだけでいい。
- データのストア方法は、1.Preferenceか2.ファイルか3.SQLite。用途によって使い分ける。
- 処理が重くなる作業は、全て「Task」を使う
- (画面描画→タスク開始→タスク実行中でもUI触れる→完了後反映)
- TaskなりHandlerなりを使わないと、フリーズしたように見えてかっこ悪い
■反省点
- エンコード時間が遅い。めっちゃ遅い。動画時間と同じくらいかかって使い物にならない。
- 動画のダウンロードの際、認証するのを忘れた。
- →最終発表の際に指摘されたが、このままでは動画がぶっこぬけてしまう。
- →DLキーを付加するなどの対処が必要。
- XMLパースの効率が悪すぎ
■感想
Androidのソフトウェア開発はとてもしやすく、技術者に優しいなと思いました。 というか、作っていて楽しかったので、機会があればリベンジしたいです。