MediaDisplay Komponente: It´s not a bug, it´s a

…feature?
Ich bin mir nicht sicher – heute bin ich auf eine weitere Eigenart einer V2 Komponente gestoßen (MediaDisplay). Wenn man mehrere zu streamende Filme (vermutlich irrelevant) nach und nach (vielleicht auch per Random?!) in einer statischen mediaDisplay-Komponente abspielen möchte, stößt man vermutlich schnell auf ein Problem …

Erstmal ein Code-Beispiel, wie so etwas aussehen könnte:

var myVideoArray:Array = new Array("video0.flv", "video1.flv", "video2.flv");<br />
function playVideo():Void {<br />
	var myIndex:Number = myRandom(0, myVideoArray.length-1);<br />
	var myVideoFile:String = "videos/"+myVideoArray[myIndex];<br />
	mediaDisplay.setMedia(myVideoFile, "FLV");<br />
	var mediaListener:Object = new Object();<br />
	mediaListener.complete = function(eventObj:Object) {<br />
		if (myVideoArray.length == 0) {<br />
			var myVideoArray:Array = new Array("video0.flv", "video1.flv", "video2.flv");<br />
		}<br />
		myVideoArray.splice(myIndex, 1);<br />
		playVideo();<br />
	}<br />
	mediaDisplay.addEventListener("complete", mediaListener);<br />
}<br />
function myRandom(minVal:Number, maxVal:Number):Number {<br />
	return minVal+Math.floor(Math.random()*(maxVal+1-minVal));<br />
}<br />
playVideo();<br />
stop();

Das funktioniert so leider nicht. Mir kommt es so vor als ob der Lesekopf der mediaDisplay-Komponente nicht richtig zurückgesetzt wird. Der Versuch dies manuell zu tun oder der mediaDisplay Komponente über setMedia() ein undefined zuzuweisen bringt nichts. Nach dem ersten Video, erscheint das zweite Video, aber es bleibt stehen.

Ok, ein Workaround löst dieses Problem. Der Code wird um folgende Zeilen ergänzt:

<br />
function playVideo():Void {<br />
	...<br />
	mediaDisplay.autoPlay = false;<br />
	...<br />
	mediaListener.start = function(eventObj:Object) {<br />
		mediaDisplay.play(0);<br />
	};<br />
	mediaDisplay.addEventListener("start", mediaListener);<br />
}<br />

Hier wird erstmal die “autoPlay” Eigenschaft auf “false” gesetzt, das Video wird also nicht automatisch abgespielt. Die Ereignisprozedur “start” wird aufgerufen, sobald das Video initialisiert wurde (Der Hilfeeintrag fehlt dazu). Dann wird das Video manuell über die Methode start() gestartet. Jetzt funktioniert es.

Eine weitere Möglichkeit wäre vermutlich die mediaDisplay-Komponente dynamisch zu attachen und zu entfernen, wieder zu attachen, etc. *hab ich nicht ausprobiert*. Dann sollte diese vollständig neu intialisiert werden.

Hinweis: Man kann sich den Einsatz der Videokomponenten natürlich auch komplett sparen (NetStream), wenn man sich alle Features, die man benötigt selbst baut. Das braucht jedoch je nach Anforderung einige Zeit …

Schreibe einen Kommentar