Ende eines FLV wird nicht erkannt

intercorni

Erfahrenes Mitglied
Hallo,

ich spiele ein FLV so ab:

PHP:
// NetConnection-Objekt erstellen:
var netConn:NetConnection = new NetConnection();
// Lokale Streaming-Verbindung erstellen:
netConn.connect(null);
// NetStream-Objekt erstellen und onStatus()-Funktion definieren:
var netStream1:NetStream = new NetStream(netConn);
netStream1.onStatus = function(infoObject) {
    if (infoObject.code == "NetStream.Play.StreamNotFound") {
    } else if (infoObject.code == "NetStream.Buffer.Full") {
        trace("Buffer voll und Start");
    } else if (infoObject.code == "NetStream.Play.Stop") {
        trace("Filmende");
    }
};
mein_video._visible = false;
// NetStream-Videofeed an das Video-Objekt anhängen:
mein_video.attachVideo(netStream1);
// Zwischenspeicherzeit festlegen:
netStream1.setBufferTime(5);
netStream1.play("detail600.flv");

Das Abspielen funktioniert super, jedoch wird das Trace am Filmende nicht ausgegeben. Und genau darüber wollte ich die Netconnection wieder schließen.
Oder wird diese automatisch zum Filmende geschlossen?

LG

Cornel
 
Hallo,

folgendes Skript sollte helfen:
Code:
var netStream1: NetStream = new NetStream(netConn);
var videoLength: Number;

netStream1.onStatus = function(infoObject) {
	if (infoObject.code == "NetStream.Play.StreamNotFound") {
	} else if (infoObject.code == "NetStream.Buffer.Full") {
		trace("Buffer voll und Start");
	} else if (infoObject.code == "NetStream.Play.Stop" && Math.round(this.time) == Math.round(videoLength)) {
		trace("Filmende");
	}
};
netStream1.onMetaData = function(obj:Object) {
	videoLength = obj.duration;
};

gruss
 
Hallo,

danke für den Tipp. Jedoch funktioniert es damit leider auch nicht :-(

Hier nochmal mein vollständiges Scripting:

PHP:
// NetConnection-Objekt erstellen:
var netConn:NetConnection = new NetConnection();
// Lokale Streaming-Verbindung erstellen:
netConn.connect(null);
//oder bspw. etwas in der Art: netConn.connect("rtmp://66.216.97.115/UserName/video");
// NetStream-Objekt erstellen und onStatus()-Funktion definieren:
var netStream1:NetStream = new NetStream(netConn);
netStream1.onStatus = function(infoObject) {
	//trace("this="+this);
	if (infoObject.code == "NetStream.Play.StreamNotFound") {
		//trace("Konnte Videodatei nicht finden.");
	} else if (infoObject.code == "NetStream.Buffer.Full") {
		trace("Buffer voll und Start");
	} else if (infoObject.code == "NetStream.Play.Stop" && Math.round(this.time) == Math.round(videolaenge)) {
		trace("Filmende");
		//Loop:
		//netStream1.seek(0);
		//an den Anfang zurück
		//netStream1.pause(true);
		//und gleich wieder starten
	}
};
mein_video._visible = false;
// NetStream-Videofeed an das Video-Objekt anhängen:
mein_video.attachVideo(netStream1);
// Zwischenspeicherzeit festlegen:
netStream1.setBufferTime(5);
//Preloader Anzeige
var loaded_interval:Number = setInterval(checkBytesLoaded, 500, netStream1);
function checkBytesLoaded(my_ns:NetStream) {
	//
	var pctLoaded:Number = Math.round(my_ns.bytesLoaded/my_ns.bytesTotal*100);
	TimeLine.TimeLinePreload._width = pctLoaded*TimeLine.TimeLineLength._width/100;
	if (pctLoaded>=100) {
		clearInterval(loaded_interval);
	}
}
// Wiedergabe der FLV-Datei:
netStream1.play("Detail600.flv");
//zurückspulen an den Anfang
btnRewind.onRelease = function() {
	netStream1.seek(0);
	//an den Anfang zurück
	netStream1.pause(false);
	//und gleich wieder starten
};
//Video stoppen
btnStop.onRelease = function() {
	netStream1.pause(true);
};
//Video abspielen
btnPlay.onRelease = function() {
	netStream1.pause(false);
};

netStream1.onMetaData = function(obj) {
	videolaenge = (obj.duration);
	//"mein_video" ist der Instanzname des Video-Objektes auf der Bühne
	//Video in der Originalgröße zeigen 
	mein_video._width = obj.width;
	mein_video._height = obj.height;
	mein_video._visible = true;
	var time_interval:Number = setInterval(checkTime, 100, netStream1);
};
function checkTime(my_ns:NetStream) {
	var current_time:Number = (my_ns.time);
	//Variablen für Zeitanzeige generieren
	var current_minutes:Number = Math.floor(current_time/60);
	var current_seconds = Math.floor(current_time%60);
	if (current_seconds<10) {
		current_seconds = "0"+current_seconds;
	}
	var videolaenge_minutes = Math.floor((videolaenge/60));
	var videolaenge_seconds = Math.floor( (((videolaenge/60)-videolaenge_minutes) * 60) );  
	if (videolaenge_seconds<10) {
		videolaenge_seconds = "0"+videolaenge_seconds;
	}
	//----------- 
	var TextToDisplay:String = (current_minutes)+":"+(current_seconds)+" | "+videolaenge_minutes+":"+videolaenge_seconds;
	TimeLine.TimeDisplay.text = TextToDisplay;  
	if (Dragging == false || Dragging == undefined) {
		var DragThingPos:Number = TimeLine.TimeLineLength._width*current_time/videolaenge;
		TimeLine.DragThing._x = Math.floor(DragThingPos);
	}
}
this.TimeLine.DragThing.onPress = this.TimeLine.DragThing.onDragOut=function () {
	Dragging = true;
	netStream.pause(true);
	this.startDrag(false, this._parent.TimeLineLength._x, this._y, this._parent.TimeLineLength._width, this._y);
	this.onMouseMove = function() {
		DragThingMove = (videolaenge*this._x)/(TimeLine.TimeLineLength._width);
		netStream.seek(DragThingMove);
	};
};
this.TimeLine.DragThing.onRelease = this.TimeLine.DragThing.onReleaseOutside=function () {
	Dragging = false;
	this.stopDrag();
	netStream.pause(false);
	delete this.onMouseMove;
	//trace("EndDrag!");
};
 
Hallo,

entferne mal die Statusabfrage aus der Bedingung.

Code:
if (Math.round(this.time) == Math.round(videolaenge)) {
        trace("Filmende");
}

Ausserdem musst du die Variable "videolaenge" instanzieren:
Code:
var videolaenge;

gruss
 
Hallo,

grundsätzlich schon, doch ohne die Instanzierung wird die Variable ins NetStream-Objekt gespeichert und nicht auf die ausführende Zeitleiste. Und so ist sie über die ganze Zeitleiste verfügbar.

In deinem speziellen Fall, wo du die Videolänge ja sowieso nur in NetStream-Eventmethoden brauchst, würde es vielleicht auch so gehen.

gruss
 
Zurück