lighttpd で Flash Video (.flv) をストリーミング配信 (2)

lighttpd で Flash Video (.flv) をストリーミング配信 (2)

2007/01/09 9:18am

前回の記事「lighttpd で Flash Video (.flv) をストリーミング配信」で、とりあえずストリーミング配信できることは書いた。今回は Flash の動画配信について調査したまとめ。

How much?

一番気になっていたのは、あの馬鹿高い「フラッシュなんちゃらサーバ」を購入しないとあかんの? というところでしたが、yuin さんがコメントしてくれた情報で解決しました。

結論からいえば、みんなの大好きな lighttpd でストリーミング配信ができる。

まあ、要するにタダだよ、と。

動画フォーマット

まず、動画フォーマットは Flash Video (.flv) になる。 これについては、.mpeg.mov からの変換ツールがごろごろあるはずなので詳細は割愛。

とりあえず、リンクだけ。

Flash Player の事情

クライアント (Flash Player) 側では、NetConnection でサーバに接続する。そして、その接続から NetStream インスタンスを生成し、これを Video インスタンスに attachVideo() することで .flv の再生が可能になる。

var nc:NetConnection = new NetConnection();
nc.connect(null); // initialize
var stream:NetStream = new NetStream(nc);
var video:Video = new Video(300,300);
...
video.attachVideo(_ns);

Flash Player 6 では、肝心の NetConnection が RTMP (Real Time Messaging Protocol) という Adobe (Macromedia) 独自のプロトコルのみサポートしていたため、フラッシュなんちゃらサーバでしかストリーミングができなかった(このへんは Flash MX 関連のドキュメントにあった記述から推測したもの。ちなみに、RTMP の仕様は非公開)。

Flash Player 7 以降

しかし、Flash Player 7 以降では NetConnection が HTTP による接続をサポートするようになったため、サーバ上の .flv に HTTP でアクセスするだけでストリーミング(っぽい)再生が可能になった。

本来のストリーミングに比べて、この方式は以下の欠点がある(他にもあるかも)。

  1. 頭からの再生しかできない
  2. そのままだと、リモートの .flv を直接ダウンロードできちゃう
  3. クライアントのローカルディスクにキャッシュされちゃう

lighttpd

そこで lighttpd ですよ。

lighttpd には 1.4.11 から mod_flv_streaming という、そのものズバリのモジュールが用意されてまして、こいつを使うと、さきほどの欠点の 1. を克服して、任意の場所から再生が可能になる。

必要な設定は、

server.modules = (
  "mod_flv_streaming"
)
flv-streaming.extensions = ( ".flv" )

こんだけ。

仕組みも単純。 クライアント側では、URL のクエリー文字列に start パラメータを追加。これで開始位置を指定してもらい、サーバ側では指定された位置のデータを返すようになっています(そのため、start パラメータによる位置指定をプレイヤー側で実装する必要がある)。

また、mod_secdownload を併用することで、欠点 2. の「直接 .flv をダウンロードされる」も克服できる。

欠点 3. が残っているとはいえ、設定も簡単だし、魅力的な選択肢なのは間違いない。