lighttpd で Flash Video (.flv) をストリーミング配信 (2)
前回の記事「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 でアクセスするだけでストリーミング(っぽい)再生が可能になった。
本来のストリーミングに比べて、この方式は以下の欠点がある(他にもあるかも)。
- 頭からの再生しかできない
- そのままだと、リモートの
.flv
を直接ダウンロードできちゃう - クライアントのローカルディスクにキャッシュされちゃう
lighttpd
そこで lighttpd ですよ。
lighttpd には 1.4.11 から mod_flv_streaming
という、そのものズバリのモジュールが用意されてまして、こいつを使うと、さきほどの欠点の 1. を克服して、任意の場所から再生が可能になる。
必要な設定は、
server.modules = (
"mod_flv_streaming"
)
flv-streaming.extensions = ( ".flv" )
こんだけ。
仕組みも単純。
クライアント側では、URL のクエリー文字列に start
パラメータを追加。これで開始位置を指定してもらい、サーバ側では指定された位置のデータを返すようになっています(そのため、start
パラメータによる位置指定をプレイヤー側で実装する必要がある)。
- lighttpd: チュートリアルとサンプル
- Using Lighttpd, Mplayer/Mencoder and Flvtool2 to Implement Flash Video Streaming
- flv streaming with lighttpd
- The Flash Video Resource: ‘Streaming’ flv video via PHP, take two
また、mod_secdownload を併用することで、欠点 2. の「直接 .flv
をダウンロードされる」も克服できる。
欠点 3. が残っているとはいえ、設定も簡単だし、魅力的な選択肢なのは間違いない。