Проблема с добавлением элементов управления видео к видео, выбранному с помощью XML comboBox - PullRequest
1 голос
/ 02 января 2011

Я намного ближе к своему окончательному желаемому результату, спасибо.

Два оставшихся вопроса, когда я нажимаю на предыдущий и следующий, имя, показанное в выпадающем списке, иногда не синхронизируется.

Также я не могу заставить работать видео скруббер.

Посмотреть это в действии

добавить index.zip к ссылке выше на исходные файлы dl(не хватает очков, чтобы опубликовать 2 ссылки)

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;

/////// Оригинальный пост //////////////

Здравствуйте, прошло уже несколько лет с тех пор, как я коснулся вспышки, так что, возможно, я просто что-то упускаю.Если кто-нибудь сможет взглянуть на код и предложить какие-либо предложения, которые будут потрясающими.

Что работает, я выбираю видео из выпадающего списка, который заполняется из файла XML, выбираю видео и оно воспроизводится.

Я пытался добавить функции паузы / воспроизведения, остановки, перемотки вперед и назад, как только я включу это, я также хочу добавить скруббер видео (слайдер) и кнопки «предыдущий / следующий», чтобы перейти к предыдущему /следующее видео, как указано в xml-файле.

На данный момент у меня есть кнопка компонента на сцене, называемая playButton, которую я пытаюсь использовать для паузы / воспроизведения.Ниже мой код, контроль игрока находится в самом низу.Спасибо.

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();
}

Ответы [ 2 ]

1 голос
/ 06 марта 2011

Ответом на мой оригинальный вопрос было использование stream.bytesTotal и stream.bytesLoaded вместо ns.bytesTotal и ns.bytesLoaded

1 голос
/ 03 января 2011

Я думаю, что вы хотите сделать это (Обработчики щелчков отличаются в AS3)

playButton.addEventListener(MouseEvent.CLICK, onTogglePlay);

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

Вы должны действительно поместить прослушиватель в NC для NetStatusEvent и затем создать NetStream, как только соединение будет установлено.

...