[AS]FMSにアップしたmp4なファイルをFLVPlaybackで再生するときのファイルパス指定の注意

結構はまったのでメモ

まず、以前のエントリーでFMS経由で動画ファイルを指定する際は拡張子が不要ということを書いたけど、これは正確ではなかった。
正確には、[FMSにflv形式でアップされているファイル]にアクセスするときは、拡張子を書かないが正解。

では、f4v形式や、mp4形式のファイルをアップした際はどうするか?
単純に拡張子をつければいいわけではなかった。
ファイル名の頭に、[mp4:]をつける必要があった。

//独自プレイヤーでの実装例(いろいろ省略)
var nc:NetConnection = new NetConnection();
nc.connect("rtmp://hoge.moge.ore/dore");
var ns:NetStream = new NetStream(nc);
ns.play("mp4:hoge.mp4");
//ns.play("mp4:hoge.f4v");//f4v形式での例

以上を踏まえて、FLVPlaybackを利用する際のパス指定も同じにしようと思ったらそうはいかなかった。

悪い例

//誤ったファイルパスの指定
var flvPlayback:FLVPlayback = new FLVPlayback();
flvPlayback.play("rtmp://hoge.moge.ore/dore/mp4:hoge.mp4");

これだとうまく接続できなかった。
FMSのヘルプを観てると、違った書き方をしてる例があった。
(19ページの上の方)

正しい例

var flvPlayback:FLVPlayback = new FLVPlayback();
flvPlayback.play("rtmp://hoge.moge.ore/mp4:dore/hoge.mp4");

[mp4:]の記述はファイルの頭ではなく、ひとつ上のフォルダに記述するらしい。
なんでかは詳しくわからんけども、今回はこれでうまく接続できた。
うまくいかない人は試してみるといいかも。

[AS]FMSからストリーミングした動画の表示拡大するときはVideoオブジェクトを直接拡大しないとだめっぽい。

ストリーミングした動画を拡大するときはVideoオブジェクトを直接操作したほうがいいっぽい。

たとえば、MovieClipクラスを拡張して、Videoを再生するクラスがあったとする。

package  {
	import flash.display.MovieClip;
	import flash.media.Video;
	import flash.net.NetConnection;
	import flash.events.NetStatusEvent;
	import flash.net.NetStream;
	
	public class LoadMovie extends MovieClip {
		
		private var ncUrl:String
		private var nsUrl:String
		private var nc:NetConnection;
		private var video:Video;
		
		public function LoadMovie(ncUrl:String, nsUrl:String, w:uint = 320, h:uint = 320 ) {
			trace("FmsMain");
			this.ncUrl = ncUrl;
			this.nsUrl = nsUrl;
			
			video = new Video();
			video.width = w;
			video.height = h;
			initConnect();
		}
		
		function initConnect():void {
			
			//ネットコネクションを作る
			nc = new NetConnection();
			nc.client = new Object();
			//ネットコネクションの接続状態を調べるリスナー
			nc.addEventListener(NetStatusEvent.NET_STATUS , onNcStatus);
			//ネットコネクションを接続する。
			nc.connect(ncUrl);
		}
		//ネットコネクションの状態でいろいろ出力される
		private function onNcStatus(e:NetStatusEvent):void {
			trace("onNcStatus : "+e.info.code);
			switch (e.info.code) {
				//もし無事に接続されたら、
				case "NetConnection.Connect.Success":
				initStream();
				break;
				case "NetConnection.Connect.Failed":
				trace("onNcStatus : "+e.info.code);
				break;
				case "NetStream.Play.StreamNotFound":
				trace("not Found");
				break;
				default :
				break;
			}
		}
		
		//ネットストリームの初期化処理
		private function initStream():void {
			//ネットコネクションを作る
			var ns:NetStream = new NetStream(nc);
			//ネットコネクションの接続状態を調べるリスナー
			ns.addEventListener(NetStatusEvent.NET_STATUS, onNsStatus);
			//読み込みの時間を設定
			ns.bufferTime = 2;
			//メタデータ取得用のオブジェクトを設定
			ns.client = new Object();
			//videoインスタンスを作成
			video.attachNetStream(ns);
			addChild(video);
			ns.play(nsUrl);
		}
		
		private function onNsStatus(e:NetStatusEvent):void {
			switch (e.info.code) {
				//もし失敗したら
				case "NetStream.Play.StreamNotFound":
				trace("NetStream Not Found");
				break;
				
				default :
				trace("onNsStatus : "+e.info.code);
			}
		}
		
	}
	
}

このクラスを利用するときはフレームアクションで、
(ローカルにelevator.flvがあるのが前提)

var ncUrl:String = null
var nsUrl:String = "elevator.flv"
var fms2:LoadMovie = new LoadMovie(ncUrl,nsUrl);
addChild(fms2);

この動画のサイズを変えたいときに

var ncUrl:String = null
var nsUrl:String = "elevator.flv"
var fms2:LoadMovie = new LoadMovie(ncUrl,nsUrl);
addChild(fms2);
fms2.width = 500;
fms2.height = 500;

まあlこれでも拡大されるのは予想通り。
ただしFMSのflvを読んでる場合は拡大されるずに動画が非表示になる。
(音はなってるから再生はされてるようす)

//これだと動画がなぜか表示されない
var ncUrl:String = "rtmp://hoge.moge"
var nsUrl:String = "doke"
var fms2:LoadMovie = new LoadMovie(ncUrl,nsUrl);
addChild(fms2);
fms2.width = 500;
fms2.height = 500;

LoadMovieクラスには、引数w,hでvideoオブジェクトのwidth、heightを操作できるようにしてあるので、

//これなら動画の大きさを操作できる。
var ncUrl:String = "rtmp://hoge.moge"
var nsUrl:String = "doke"
w = 500;
h = 500;
var fms2:LoadMovie = new LoadMovie(ncUrl,nsUrl,w,h);
addChild(fms2);

もちろんローカルのflvを再生するときもこのVideoオブジェクトを操作する方法でOK。
なので、つねにこっちの方法を使った方が安全っぽい。


上記の例でFMSから読み込んだ場合のLoadMovieオブジェクトのwidthとheightは、w,hをどんな値を設定しても0になるようだ。
(ローカルflvを読み込んだ場合は指定した数値となる)

//FMSの場合
var ncUrl:String = "rtmp://hoge.moge"
var nsUrl:String = "doke"
w = 500;
h = 500;
var fms2:LoadMovie = new LoadMovie(ncUrl,nsUrl,w,h);
addChild(fms2);
trace(fms2.width) //出力:0
trace(fms2.height) //出力:0

ローカルflvを読み込んだ場合

//ローカルFLVの場合
var ncUrl:String = null
var nsUrl:String = "elevator.flv"
w = 500;
h = 500;
var fms2:LoadMovie = new LoadMovie(ncUrl,nsUrl,w,h);
addChild(fms2);
trace(fms2.width) //出力:500
trace(fms2.height) //出力:500

FMSから読み込んだものは実体がないということなのかな?

[AS]FMSを使った動画再生をするときの設定の注意点

FMS:Flash Media Server
ローカルのflvのprogressive再生のときとFMSでの設定の違いをメモしとく
NetConnectionの設定で
ローカルflvの時は

//ローカルのflvを再生するとき
var nc:NetConnection = new NetConnection();
nc.connect(null);

FMSのときは、

//FMSを使うとき
var nc:NetConnection = new NetConnection();
nc.connect("rtmp://hoge.moge.ore.dore");
nc.client = new Object();

FMSのときはnc.connectにURLを設定(flvファイルの手前のフォルダまで)
※上の例はURLが rtmp://hoge.moge.dore.flvだった場合
あと、nc.client、ローカルflvでは設定しなくていいけど、FMSのときは設定してあげないとエラーになる。

あとNetStreamの設定
ローカルflvのときは、

var ns:NetStream = new NetStream(nc);
ns.play("doke.flv")

FMSのときは

var ns:NetStream = new NetStream(nc);
ns.play("doke")

FMSのときは、.flvをつけると宜しくないようす。

情報追記:2011/02/22
http://memo.393.bz/archives/1480