【问题标题】:Actionscript 3 FlvPlayback with XML and For-Loop带有 XML 和 For 循环的 Actionscript 3 FlvPlayback
【发布时间】:2011-01-07 16:18:55
【问题描述】:

我有一个应用程序,我想拥有尽可能多的 FLV 播放器(每个播放器只能播放一个视频),由 XML 控制。我控制一些变量(肤色、玩家 x 和 y 等)。 我的代码正在运行,但存在一些问题,因此我需要帮助来优化我的代码。 一个问题是视频全屏,我把一个视频全屏,另一个全屏……还有皮肤 alpha 的其他问题,自动播放也会发生..

我的 AS3

import fl.video.*;
import flash.events.ProgressEvent;
import fl.controls.ProgressBar;
import fl.controls.ProgressBarMode;

var my_videos:XMLList;
var my_total:Number;
var my_player:FLVPlayback;
var player_skin_color:Number;
var player_skin_alpha:Number;
var auto_play:Boolean;

var videoArray:Array = new Array();

var myXMLLoader:URLLoader = new URLLoader();
myXMLLoader.load(new URLRequest("test.xml"));
myXMLLoader.addEventListener(Event.COMPLETE, processXML);

function processXML(e:Event):void {

 var myXML:XML = new XML(e.target.data);

 my_videos = myXML.VIDEO;
 my_total = my_videos.length();

makePlayer();
positionPlayer();
}


function makePlayer():void {

 for (var i:int = 0; i < my_total; i++) {

 my_player = new FLVPlayback();
 my_player.skin = "SkinOverPlayFullscreen.swf";
 my_player.skinBackgroundColor = player_skin_color;
 my_player.skinBackgroundAlpha = player_skin_alpha;
 my_player.autoPlay = auto_play;

 player_skin_color = my_videos[i]. @ PLAYER_SKIN_COLOR;
 player_skin_alpha = my_videos[i]. @ PLAYER_SKIN_ALPHA;
 auto_play = my_videos[i]. @ VIDEO_AUTOPLAY;

 addChild(my_player);
 videoArray.push(my_player);
 my_player.source = my_videos[i]. @ URL;
 }
}

function positionPlayer():void {

 for (var i:int = 0; i < my_total; i++)
{
 videoArray[i].x = my_videos[i] . @PLAYER_X;
 videoArray[i].y = my_videos[i] . @PLAYER_Y;
 videoArray[i].width = my_videos[i] . @PLAYER_WIDTH;
 videoArray[i].height = my_videos[i] . @PLAYER_HEIGHT;

 }
}

我的 XML

<?xml version="1.0" encoding="utf-8"?>
<content>

  <VIDEO PLAYER_X="450" PLAYER_Y="0" PLAYER_WIDTH="400" PLAYER_HEIGHT="300" PLAYER_SKIN_COLOR="0x0000FF" PLAYER_SKIN_ALPHA="1" VIDEO_AUTOPLAY="true" URL="test.flv"></VIDEO>

  <VIDEO PLAYER_X="0" PLAYER_Y="0" PLAYER_WIDTH="400" PLAYER_HEIGHT="300" PLAYER_SKIN_COLOR="0x333333" PLAYER_SKIN_ALPHA="1" VIDEO_AUTOPLAY="true" URL="test2.flv"></VIDEO>

</content>

更新:

import flash.display.StageDisplayState;
import flash.display.StageAlign;
import flash.display.StageScaleMode;

stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;

function goFullScreen():void
{
if (stage.displayState == StageDisplayState.NORMAL) {
stage.displayState=StageDisplayState.FULL_SCREEN;
} else {
stage.displayState=StageDisplayState.NORMAL;
}
}


//GREENSOCK LIQUID LAYOUT

var ls:LiquidStage = new LiquidStage(this.stage,900,600,900,600);

ls.attach(video_container_mc, ls.CENTER, false, true, 0);

【问题讨论】:

    标签: xml flash actionscript-3 for-loop flvplayback


    【解决方案1】:
    import fl.video.*;
    import flash.events.ProgressEvent;
    import fl.controls.ProgressBar;
    import fl.controls.ProgressBarMode;
    
    var my_videos:XMLList;
    var my_total:Number;
    var player_skin_color:Number;
    var player_skin_alpha:Number;
    var auto_play:Boolean;
    
    var videoArray:Array = new Array();
    
    var myXMLLoader:URLLoader = new URLLoader();
    myXMLLoader.load(new URLRequest("test.xml"));
    myXMLLoader.addEventListener(Event.COMPLETE, processXML);
    
    function processXML(e:Event):void {
    
     var myXML:XML = new XML(e.target.data);
    
     my_videos = myXML.VIDEO;
     my_total = my_videos.length();
    
    makePlayer();
    positionPlayer();
    }
    
    
    function makePlayer():void {
    
     for (var i:int = 0; i < my_total; i++) {
    
     var my_player:FLVPlayback = new FLVPlayback();
     my_player.name = "FLVplayer_" + i;
     my_player.skin = "SkinOverPlayFullscreen.swf";
    
     player_skin_color = my_videos[i].@PLAYER_SKIN_COLOR;
     player_skin_alpha = my_videos[i].@PLAYER_SKIN_ALPHA;
     auto_play = my_videos[i].@VIDEO_AUTOPLAY;
    
     my_player.skinBackgroundColor = player_skin_color;
     my_player.skinBackgroundAlpha = player_skin_alpha;
     my_player.autoPlay = auto_play;
    
     my_player.source = my_videos[i].@URL;
     videoArray.push(my_player);
    
     addChild(my_player);
     }
    }
    
    function positionPlayer():void {
    
     for (var i:int = 0; i < my_total; i++)
    {
     videoArray[i].x = my_videos[i].@PLAYER_X;
     videoArray[i].y = my_videos[i].@PLAYER_Y;
     videoArray[i].width = my_videos[i].@PLAYER_WIDTH;
     videoArray[i].height = my_videos[i].@PLAYER_HEIGHT;
    
     }
    }
    

    【讨论】:

    • 基本上你做得很好,但是你在循环中覆盖了 my_player。我没有使用类变量,而是在循环中添加了一个局部变量,然后该实例将添加到数组中。在将皮肤属性添加到播放器实例后,还会声明皮肤属性。
    • 谢谢,您说的完全正确!现在所有的皮肤和位置都很好。全屏不,但很奇怪,如果我在 xml 中有四个视频,如果我单击任何全屏按钮,xml 中的最后一个视频将进入全屏。在我第二次点击视频全屏时,所有视频都会崩溃并改变位置。我认为是全屏冲突的闪存问题。
    • 如果您发布了处理 DisplayState 更改的代码,我们可以看到它有什么问题。
    • 我更新了我的问题,我使用 greensock 在舞台调整大小时居中布局,该代码适用于一个视频但还有更多...
    【解决方案2】:

    每次添加 FLVPlayback 实例时,都会在 my_player 上创建它。

    而不是

    my_player = new FLVPlayback();
    

    试试

    //Create an array for the players
    var my_players:Array = new Array();
    
    //Add the player instances to the array
    my_players.push (new FLVPlayback());
    

    它应该解决其他问题。

    罗伯

    【讨论】:

    • 你好,谢谢你的回答,一个问题,我应该删除videoArray吗?
    • 我用你的代码尝试了几件事,但我遇到了同样的问题。我没有错误,但视频没有出现。
    • 嗨,对不起,我的回答是公牛。请看我的新的。
    猜你喜欢
    • 2018-05-19
    • 1970-01-01
    • 2011-06-21
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    相关资源
    最近更新 更多