vixy.tvの映像サーバ:Izumi FLV Serverについて

前回少し vixy.tv の概要を書きましたが、そろそろクライアントアプリ(Vixy.tv Broadcaster)の新バージョンもリリース時期が迫ってきましたので、もうちょっと技術的なことを書きます。サービス全体の解説とか背景はまた次回で。


まず、YouTubeって「ストリーミング」じゃないの?という話題から。言葉の定義ですが、「(True)ストリーミング」と「疑似ストリーミング」はここでは分けて取り扱います。YouTubeはその区別からすると、「疑似ストリーミング」にあたります。

YouTubeニコニコ動画で映像を視聴すると、映像は視聴しているブラウザのキャッシュにFLVファイルとして保存されます。では、どういった仕組みでFlash Playerは映像を再生しているのか、というと、Flash Playerは、FLVファイルが置いてあるApacheなどのHTTPサーバから、自分の再生状況等に応じてFLVファイルを 裏側でダウンロードしながら 再生している、ということになります。これが、「疑似」たるゆえんです。さらにFlash Playerには、HTTPで受信したものは、「キャッシュしないでくれ」というフラグを立てようが、問答無用でブラウザのキャッシュに残す、という不思議な仕様があります。このため、ちょっと知っている人ですと、YouTubeで視聴した映像のFLVファイルを、ブラウザのキャッシュから回収(それも特別なツールも必要なく、単にエクスプローラー等でコピーするだけ)、ということも可能です。

これに対して、FLVの「(True)ストリーミング」というのは、RTMPというAdobe Flash Media Server(以下FMS)独自のプロトコルを使用して、ブラウザのキャッシュに残さないで、なおかつ、長時間延々と視聴し続けることが出来ます。RTMPは、RFCにもなっていないような完全にクローズドな規格ですが、弊社ではRTMPと互換性のあるサーバ(正確に言うと、FLVをストリーミング配信するのに必要な部分だけ)を開発しました。このため、キャッシュに残すことなく、長時間再生が可能になっています。

まとめると以下のような形になります。

比較ポイント 疑似ストリーミング(HTTP) (True)ストリーミング(RTMP)
サイトで使われている例 YouTube, ニコニコ動画 など Vixy.tv, ustream.tv, Yahoo! Live など
プレイヤーの再生動作 HTTPでダウンロード RTMPでストリーミング
キャッシュに? 残る。ディスクに保存され、ユーザーはFLVの回収が可能。 残らない。オンメモリで処理されディスクに保存されない。
長時間再生(数時間オーダー) キャッシュ用のディスクを圧迫して厳しい 十分可能
ライブ用途 不可能ではないが上記のディスクキャッシュの問題がある 十分可能

特にライブ用途に限って言うと、HTTPでの疑似ストリーミングでも不可能ではありません。弊社では、以前同様のサービス構築のためにHTTPでライブ配信が出来るサーバーを試験的に作成して、1時間程度の配信実験を行ったことがあります。ですが、これがやはり上記のディスクキャッシュの問題があり、実サービス/実運用は難しいと判断し、RTMP互換サーバ開発へと繋がりました。(もちろん vixy.net でのノウハウがここら辺から生きています)


前置きが長くなりましたが、ここからが本題です。
現状 vixy.tv では、Vixy.tv BroadcasterというWindowsアプリケーションを無償で配布しています。その中で動いているRTMP互換サーバ機能は、弊社内のコードネームでIzumi FLV Serverという名前がついています。(Izumiは「泉」から)
特徴は、

  • 現状ではWindowsおよびLinuxで実働中。MacOSXには移植中。
  • 現状ではおそらくFMS互換で唯一のC++実装
  • メモリ/CPU消費量がRed5と比較して軽量(FMSとはまだ勝負させていません)
  • libeventを使っていて、とくにLinuxでかなり軽量に動作する(負荷テスト中ですが、1台で数百接続は十分軽量な範囲で動作)
  • リアルタイムのFLVパケット受付(直接入力のFIFOに渡す)とHTTPライブ入力機能
  • 出力はRTMP(FLVストリーミングの部分でFMS互換)いまのところ、いわゆる普通のFLV(SorensonSpark)とVP6のFLVで確認済み
  • H.264/AAC対応は絶賛開発中

という感じです。FLVストリーミングに特化した作りになっていて、非常にコンパクト/軽量なのが特徴です。あと、Javaで実装されたオープンソースものは最近いくつか(Red5, Milgra)あるんですが、私どもはC++にしたため、比較的容易にどこにでも組み込むことができるのではないかと思っています。(多分モバイルとか組み込み系なんかでも軽いんでOKでしょう。)

またこのIzumi FLV Serverの応用例として、Vixy.tv Broadcasterアプリのほかに、Izumi Proというコードネームで、業務用途等向けに、Linux専用のVOD/ライブストリーミング版もほぼベータ段階で、こちらはWeb管理画面からVODの配信ファイルを登録できるなど、FMSを超シンプルにしたようなイメージの管理画面で操作可能で、VODとライブでFLVストリーミングが出来る、というソリューションも開発中です。ご興味のある方は、弊社のほうにまでお問い合わせください。現状デモなども可能です。