Dabits

サーバサイドから運営まで何でもやるエンジニア系DJ

ドワンゴインターンで作ったもの

■実装するためには?

  • AndroidH.264動画が再生可能、ニコ動はflv
    • →変換サーバが必要
  • ランキング取得には裏でしか使えないAPIを叩かなければならない
    • API中継が必要
  • マイリスト取得にはuser_idが必要だが、クライアントには保存されてない
    • →独自のセッション管理が必要

■バックエンド

●サーバ構成

サーバは以下の4台構成としました。 これはiPhone版ニコニコプレーヤの仕組みを参考にしています。

  • infoサーバ:裏APIとの中継サーバ、ログイン管理
  • manageサーバ:ログイン情報、動画キュー情報管理DB
  • frontサーバ:動画エンコード情報取得、エンコードされた動画のキャッシュ
  • convサーバ:キュー処理による動画のエンコード
  • 以下、各サーバの解説をしていきます。

    ●infoサーバ

    動画以外の情報を入出力するためのサーバです。 ログイン情報はニコニコ動画本家のログイン管理加え、 マイリスト等取得用に独自でセッション管理しています(Memcache使用)。 それ以外の、たとえばランキングや、動画情報の取得については、 内側でのみ使えるAPIをそのまま中継して使用しています。

    ●manageサーバ

    ログイン情報用のMemcache、動画エンコード管理用のキューDBを ストアしておくためのサーバです。実運用においては、セキュリティを確保するために LAN内からのみアクセス可能としておきます。 本来、ログイン情報、キュー情報を管理するためのコンソールが必要ですが、 今回は開発時間が足りなかったため実装できませんでした。

    ●frontサーバ

    エンコード済みの動画をAndroid本体に送信するためのサーバです。 動画リクエストを受けた際に、動画のエンコード状態をチェックし、 既にキャッシュ済みであれば、その動画のurlを返しダウンロードさせます。 未エンコードで、かつキューがない場合は、キューを作成して、クライアントにWAIT命令を出します。 エンコード済みであれば、convサーバからhttpで動画をロードして、 自urlをクライアントに返します。

    ●convサーバ

    キューにたまっている動画をエンコードするサーバです。 処理は単純で、延々とキューを読み出し、愚直にエンコードしてゆくだけです。 エンコードが完了したらhtdocsに保存し、DBにエンコード完了フラグをセットします。

    ■バックエンド動作構造

    ※発表資料まんまなんで、気が向いたら修正しますw

    Androidソフトウェア部分の実装

    ●実装すべきもの

    • 各画面UI
    • http通信、xmlパース
    • 設定保存
    • 動画描画
    • コメント描画

    ●動作フロー

    1. ログイン(未ログインの場合は設定画面へ)
    2. 各種動画一覧/設定
      • ランキング
      • 動画検索
      • マイリスト
      • 設定
    3. 動画選択
    4. エンコード状態取得
      • WAIT→一定周期ごとに再アクセス
      • READY→付随URLを元に動画再生スタート
    5. 動画再生
      • コメント情報取得
      • 動画のストリーミングは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パースの効率が悪すぎ
      • →軽いXMLパーサを使おうとするとfor文でぶん回すナンセンスなコードになってしまうし、高度なXMLパーサを使うと、メモリ不足になってしまう。
      • XMLを使わない構成が必要。JSONを使うといいらしい。

    ■感想

    Androidのソフトウェア開発はとてもしやすく、技術者に優しいなと思いました。 というか、作っていて楽しかったので、機会があればリベンジしたいです。

    その他リンク