凄い基本的な話なのですが、FLV を使用するときは絶対パスでのプログレッシブ再生か FMS を利用したストリーミング配信でのみ開発したことがあったのですが、先日相対パスで読み込もうとしたら読み込めず、httpHeaders で調べたら 404 が返っておかしな挙動をしていたのでメモ。
理由は単純なんですが、仕様を明確に目にしたかったので調べたらこのページにこんな記述が。
注意:ビデオクリップがFLV形式の場合、FLVファイルのパスは相対パス(SWFを基準にした相対位置)で指定されるので、サーバ上で使用するのと同じディレクトリ構造をローカルでも使用できます。

ディレクトリ構成図サンプル
なるほど。
jpg、swf、xml、css、txt などの場合は swf を表示させる html の場所を基準に相対パスを設定するが、flv は違うんですね。上記の図で index.html に index.swf を読み込み表示させ、index.swf が loadMovieNum で main.swf を読み込み、この main.swf が flv を相対パスで読み込むと想定すると、index.html は main/index.swf で index.swf を読み込み、index.swf は index.html を基準に main.swf ではなく main/main.swf として swf を読み込む。同様な考えで flv も index.html を基準に main/flv/sample.flv として読み込もうとするとパスがづれ 404 エラーが返る。flv の読み込みだけは読み込む swf からの相対パスになるみたいで、main.swf から考えた相対パス flv/sample.flv で読み込まれた。
ソースはこんな感じ。
var nc:NetConnection = new NetConnection();
nc.onStatus = function(info:Object):Void {
switch(info.code) {
case "NetConnection.Connect.Success":
startVideo();
break;
case "NetConnection.Connect.Failed":
trace("failed");
break;
case "NetConnection.Connect.Rejected":
trace("rejected");
break;
case "NetConnection.Connect.Closed":
trace("closed");
break;
default:
}
}
nc.connect(null);function startVideo():Void {
var ns:NetStream = new NetStream(nc);
local_video.attachVideo(ns);
ns.play("main/flv/sample.flv");
ns.play("flv/sample.flv");
}
flv を使用して数年。
初めてこの現実を知りました。。。











