トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     FLV のプログレッシブ再生終了後のタイムラインの制御について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
sanagirock
Åê¹ÆNo.34690
投稿日時: 2007-8-15 21:58
新米
居住地:
投稿: 3
使用環境:
FLV のプログレッシブ再生終了後のタイムラインの制御について
FLV のプログレッシブ再生を一度だけさせた後、親MCの1フレーム目に
自動的に戻るよう制御させたいと思っています。
再生が終了したかどうかを判別する要素がスクリプトの中に
必要になってくるのでしょうか?

kakujirou
Åê¹ÆNo.36443
投稿日時: 2007-11-25 1:08
新米
居住地:
投稿: 12
使用環境:
Re: FLV のプログレッシブ再生終了後のタイムラインの制御について
時間が経っていますが、私もかなりこの問題でひっかかりました。

var stream_ns = new NetStream(connection_nc);

stream_ns.onStatus = function(infoObject) {
 code = infoObject.code;
};

this.onEnterFrame = function() {
 if ( code =="NetStream.Play.Stop"){
  gotoAndStop(飛ばしたい場所);
 }
};

こんな感じでFLVプログレッシブ再生の終了時の動作を制御できます。とはいえプログレッシブの場合は、このinfoObjectが上手く帰ってこない感じがします(受け損なうというか)。Streamingと違って相互に情報伝達をしていないからだとは思うんですが、いろいろ試してみて下さい。
knagai
Åê¹ÆNo.36444
投稿日時: 2007-11-25 18:42
職人
居住地: 白馬村
投稿: 796
使用環境:
Re: FLV のプログレッシブ再生終了後のタイムラインの制御について
FLVのメタデータからFLVの長さを取得しておいて、
"NetStream.Play.Stop"のときに、
その長さと今の再生時間を比べるという方法はどうでしょうか?


var video:Video;
var duration:Number;
var nsTime_txt:TextField;
var metaTime_txt:TextField;
//
var nc:NetConnection = new NetConnection();
nc.connect(null);
var ns:NetStream = new NetStream(nc);
ns.onMetaData = function(meta:Object) {
	metaTime_txt.text = meta.duration+"秒";
	duration = meta.duration;
};
ns.onStatus = function(info:Object) {
	trace(info.code);
	nsTime_txt.text = ns.time+"秒";
	if (info.code == "NetStream.Play.Stop" && (ns.time>=duration)) {
		trace("終了");
	}
};
video.attachVideo(ns);
ns.setBufferTime(5);
ns.play("fileName.flv");


----------------
永井勝則:
himco.jp :

kakujirou
Åê¹ÆNo.36445
投稿日時: 2007-11-25 23:46
新米
居住地:
投稿: 12
使用環境:
Re: FLV のプログレッシブ再生終了後のタイムラインの制御について
なるほど。
この方法ですと二重チェックになり変数の受け損ないにも対応できますね。
非常に勉強になりました。
早速試してみます。
knagai
Åê¹ÆNo.36447
投稿日時: 2007-11-26 1:23
職人
居住地: 白馬村
投稿: 796
使用環境:
Re: FLV のプログレッシブ再生終了後のタイムラインの制御について
”受け損ない”に思えるのは、
this.onEnterFrame = function() {
 if ( code =="NetStream.Play.Stop"){
  gotoAndStop(飛ばしたい場所);
 }
};
の部分のせいだと思います。
NetStreamはイベントの発生を見張っているのでonStatusでその状態の変更を受け止めればよいだけです。
onEnterFrameイベントハンドラメソッドだとムービーのfpsが12の場合、1秒間に12回enterFrameイベントが発生しているので、その一瞬のすきまにイベントが発生すると、”受け損なう”ように思えるのではないでしょうか?

長くなりますが、参考までに前に提示した方法と同じ方法で「FLVの再生終了」をとらえるクラスを書いてみました。
ただし前の方法の方がコードは短く、使い方も簡単です。
また(ns.time>=duration)の部分はどっちを大きくすればよいのかはっきりしません。
//VideoComplete.asファイル
import mx.events.EventDispatcher;
import mx.utils.Delegate;
class VideoComplete {
	private var ns:NetStream;
	private var duration:Number;
	private var dispatchEvent:Function;
	private var addEventListener:Function;
	private var removeEventListener:Function;
	public function VideoComplete(netS:NetStream) {
		this.ns = netS;
		init();
	}
	private function init():Void {
		EventDispatcher.initialize(this);
		ns.onMetaData = Delegate.create(this, this.onMetaDataListener);
		ns.onStatus = Delegate.create(this, this.onCompleteListener);
	}
	private function onMetaDataListener(meta:Object):Void {
		duration = meta.duration;
	}
	private function onCompleteListener(info:Object):Void {
		if (duration != undefined) {
			if (info.code == "NetStream.Play.Stop" && (ns.time>=duration)) {
				var eventObject:Object = new Object();
				eventObject.type = "videoCompleted";
				eventObject.target = this;
				eventObject.nsTime = ns.time;
				eventObject.infoCode = info.code;
				this.dispatchEvent(eventObject);
			}
		}
	}
	public function addListener(evt:String, listener:Object) {
		this.addEventListener(evt, listener);
	}
	public function removeListener(evt:String, listener:Object) {
		this.removeEventListener(evt, listener);
	}
}


//メインのタイムライン
var video:Video;
var videocomplete:VideoComplete;
var nc:NetConnection = new NetConnection();

nc.connect(null);
var ns:NetStream = new NetStream(nc);
//
videocomplete = new VideoComplete(ns);
var listener:Object = new Object();
listener.videoCompleted=function(info:Object){
	trace(info.nsTime)
	trace(info.infoCode)
}
videocomplete.addListener("videoCompleted", listener);
//
video.attachVideo(ns);
ns.setBufferTime(5);
ns.play("filePath.flv");


----------------
永井勝則:
himco.jp :

kakujirou
Åê¹ÆNo.36449
投稿日時: 2007-11-26 2:33
新米
居住地:
投稿: 12
使用環境:
Re: FLV のプログレッシブ再生終了後のタイムラインの制御について
永井勝則 様

>onEnterFrameイベントハンドラメソッドだとムービーのfpsが12の場合、1秒間に12回enterFrameイベントが発生しているので、その一瞬のすきまにイベントが発生すると、”受け損なう”ように思えるのではないでしょうか?

なるほど。
確かに仰る通りですね。
ムービーは基本的に30FPSですから、そのズレの間に生じていると想像できます。こちらも早速試させて頂きます。


>また(ns.time>=duration)の部分はどっちを大きくすればよいのかはっきりしません

そうなんですよね。おそらくmetaに入っているdurationが厳密ではないんだと思います。(エンコーダーの仕様によるものかと)
場当たり的ですが、私は下記のコードを

if (info.code == "NetStream.Play.Stop" && (ns.time>=duration)) {

以下のように修正してみました。

if ( info.code =="NetStream.Play.Stop" || ((Math.ceil(ns.time*10)/10) >= (Math.floor(duration*10)/10))){

ご指摘いただく前の段階でしたのでフレームのズレによる”受け損なう”にも対応できました。
ご指摘頂いた箇所を修正すれば、”受け損なう”という不具合もなくなりこういった判定も不要かとは思いましたが。


スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops