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. が残っているとはいえ、設定も簡単だし、魅力的な選択肢なのは間違いない。