2011-01-02 7 views
1

Ich bin meinem endgültigen gewünschten Ergebnis viel näher, danke.Probleme beim Hinzufügen von Videosteuerelementen zu einem Video, das mit XML ausgewählt wurde. ComboBox

Zwei verbleibende Probleme, wenn ich vorher und nachher drücke, wird der Name in der Combobox manchmal nicht synchron angezeigt.

Auch ich kann nicht scheinen, um den Video-Scrubber zu arbeiten.

See it in action

hinzufügen index.zip auf den Link oben, um dl-Quelldateien (nicht genug Punkte haben 2 Links posten)

import fl.data.DataProvider; 
import flash.net.NetStream; 

var nc:NetConnection = new NetConnection(); 
nc.connect(null); 
var ns:NetStream = new NetStream(nc); 
var videosXML:XML = new XML(); 
var loader:URLLoader = new URLLoader(); 
var request:URLRequest = new URLRequest("xml/videos.xml"); 
var videos:Array = new Array({label:"Select a Video",data:""}); 
var client:Object = new Object(); 
var _currentVideoId:int = 0; 
var _isPlaying:Boolean = false; 
var stream:NetStream; 
var videoURL:String; 
var connection:NetConnection; 
var videoInterval = setInterval(videoStatus,100); 
var amountLoaded:Number; 
var meta:Object = new Object(); 
var duration:Number; 

// load the XML 

loader.addEventListener(Event.COMPLETE,loaderOnComplete); 
loader.load(request); 

function loaderOnComplete(event:Event):void 
{ 
    videosXML = new XML(event.target.data); 
    for each (var video:XML in videosXML.video) 
    { 
     videos.push({label:video.name.toString(),data:video.url.toString()}); 
    } 
    moviesCB.dataProvider = new DataProvider(videos); 

    // load the first video 
    initialize_video_player(); 
} 

function initialize_video_player():void 
{ 
    // loads first video in list 
    videoURL = videosXML.video[0].url; 
    connection = new NetConnection(); 
    connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 
    connection.connect(null); 
    moviesCB.selectedIndex = _currentVideoId++; 
} 

function playerControls():void 
{ 
    pauseBtn.addEventListener(MouseEvent.CLICK, PauseVideo, false, 0, true); 
    playBtn.addEventListener(MouseEvent.CLICK, PlayVideo, false, 0, true); 
    nextBtn.addEventListener(MouseEvent.CLICK, NextVideo); 
    previousBtn.addEventListener(MouseEvent.CLICK, PreviousVideo); 
} 

function PauseVideo($e:MouseEvent):void 
{ 
    stream.togglePause(); 
} 

function PlayVideo($e:MouseEvent):void 
{ 
    stream.resume(); 
} 

function netStatusHandler(event:NetStatusEvent):void 
{ 
    switch (event.info.code) 
    { 
     case "NetConnection.Connect.Success" : 
     connectStream(); 
     break; 
     case "NetStream.Play.StreamNotFound" : 
     trace("Unable to locate video: " + videoURL); 
     break; 
    } 
} 

function connectStream():void 
{ 
    stream = new NetStream(connection); 
    stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 
    stream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); 
    theVideo.attachNetStream(stream); 
    playerControls(); 
} 

function securityErrorHandler(event:SecurityErrorEvent):void 
{ 
    trace("securityErrorHandler: " + event); 
} 

function asyncErrorHandler(event:AsyncErrorEvent):void 
{ 
    // ignore AsyncErrorEvent events. 
} 

moviesCB.addEventListener(Event.CHANGE, changeHandler); 

function changeHandler(event:Event):void 
{ 
    if (ComboBox(event.target).selectedItem.data != "") 
    { 
     stream.play(ComboBox(event.target).selectedItem.data); 
     _currentVideoId=moviesCB.selectedIndex; 
     } 
} 

function NextVideo(e:MouseEvent):void 
{ 
    if (_currentVideoId<videosXML.video.length()-1) 
{ 
    _currentVideoId++; 
    loadNewVideo(); 
} 
else 
{ 
    // do nothing, already at maximum videoId 
} 
} 

function PreviousVideo(e:MouseEvent):void 
{ 
    trace ("previous video with current video of "+_currentVideoId); 
    if (_currentVideoId>0) 
    { 
     _currentVideoId--; 
      loadNewVideo(); 
    } 
    else 
    { 
    // do nothing, already at 0 
    } 
} 

function loadNewVideo():void 
{ 
// because it's not a mouse action, tell the stream what to play 
stream.play(videosXML.video[_currentVideoId].url.toString()); 
// and update the selectedIndex of the ComboBox 
moviesCB.selectedIndex=_currentVideoId; 
} 

function videoStatus() 
{ 
amountLoaded = ns.bytesLoaded/ns.bytesTotal; 
videoLoader.loadBar._width = amountLoaded * 640; 
} 

meta.onMetaData = function(meta:Object) 
{ 
trace(meta.duration); 
} 

ns.client = meta; 

/////// Original-Beitrag////////////////

Hallo, es ist ein paar Jahre her, seit ich Flash berührt habe, vielleicht habe ich nur etwas übersehen. Wenn jemand den Code anschauen und Vorschläge machen könnte, wäre das großartig.

Was funktioniert, wähle ich ein Video aus einer Combobox, die aus einer XML-Datei gefüllt ist, wählen Sie das Video und es spielt.

Ich habe versucht, Pause/Wiedergabe, Stopp, Vorwärts und Rückwärtsfunktion hinzuzufügen, sobald ich das zum Arbeiten bekomme ich auch einen Video-Scrubber (Slider) hinzufügen möchten, und vorherige/nächste Tasten, um zum vorherigen zu gehen/nächstes Video wie in der XML-Datei aufgelistet.

Im Moment habe ich eine Komponente Taste auf der Bühne namens playButton, die ich versuche für Pause/Play-Funktionalität zu verwenden. Unten ist mein Code, die Player-Kontrolle ist ganz unten. Vielen Dank.

import fl.data.DataProvider; 

var nc:NetConnection = new NetConnection(); 
nc.connect(null); 
var ns:NetStream = new NetStream(nc); 
var videosXML:XML = new XML(); 
var loader:URLLoader = new URLLoader(); 
var request:URLRequest= new URLRequest("xml/videos.xml"); 
var videos:Array = new Array({label:"Select a Video",data:""}); 
var client:Object = new Object(); 

theVideo.attachNetStream(ns); 
ns.client = client; 
loader.addEventListener(Event.COMPLETE,loaderOnComplete); 
loader.load (request); 

function loaderOnComplete(event:Event):void{ 
    videosXML = new XML(event.target.data); 
    for each (var video:XML in videosXML.video){ 
     videos.push({label:video.name.toString(),data:video.url.toString()}); 
    } 
    moviesCB.dataProvider = new DataProvider(videos); 
} 

moviesCB.addEventListener(Event.CHANGE, changeHandler); 

function changeHandler(event:Event):void { 
    if(ComboBox(event.target).selectedItem.data != ""){ 
     ns.play(ComboBox(event.target).selectedItem.data); 
    } 
}; 

client.onMetaData = metadataHandler; 
function metadataHandler(md:Object):void{ 
} 

//player controls 
playButton.onRelease = function() { 
    ns.pause(); 
} 
+0

Ich denke, Ihre Play-Taste funktioniert es sonst ein Toggle sein muss, verwenden, nur das erste Mal, Nein? – redconservatory

+0

Ich habe eine separate Wiedergabe und Pause-Taste, ich denke, es wäre sinnvoll, sie zu konsolidieren, ist es möglich, die Beschriftung mit AS zu ändern, ich rate irgendeine Art if-Anweisung? – Chuck

Antwort

1

Die Antwort auf meine ursprüngliche Frage war stream.bytesTotal und stream.bytesLoaded statt ns.bytesTotal und ns.bytesLoaded

1

Ich glaube, Sie dies tun wollen (Anweisungen Handlers in AS3 verschieden sind)

playButton.addEventListener(MouseEvent.CLICK, onTogglePlay); 

function onTogglePlay(e:MouseEvent):void { 
    ns.togglePause(); 
} 

Sie wirklich einen Zuhörer auf der NC für die NetStatusEvent setzen sollte und dann die NetStream erstellen, sobald die Verbindung in Verbindung gebracht.

+1

Danke, das endete als Teil der Lösung. – Chuck

Verwandte Themen