【问题标题】:Synchronously play videos from arrays using actionscript 3使用 actionscript 3 同步播放数组中的视频
【发布时间】:2014-07-08 06:24:44
【问题描述】:

我正在使用 Actionscript 3.0 开发一个 AIR 应用程序。该应用程序在两个单独的监视器上加载两个本机窗口。监视器 1 将播放视频,监视器 2 将同步播放同一视频的叠加版本(即红外线)。目前,我正忙于找出加载视频的最佳方式。我正在考虑使用数组,但我想知道,如果我这样做了,如何链接数组以便将主要场景链接到其次要覆盖视频。

到目前为止,这是我的代码。它的第一部分创建了 2 个原生全屏窗口,然后你会看到我在底部开始对数组进行编码:

package
{

import flash.display.NativeWindow;
import flash.display.NativeWindowInitOptions;
import flash.display.NativeWindowSystemChrome;
import flash.display.Screen;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageDisplayState;
import flash.display.StageScaleMode;


public class InTheAirNet_MultiviewPlayer extends Sprite {

    public var secondWindow:NativeWindow;

    public function InTheAirNet_MultiviewPlayer() {

        // Ouput screen sizes and positions (for debugging)
        for each (var s:Screen in Screen.screens) trace(s.bounds);                

        // Make primary (default) window's stage go fullscreen
        stage.align = StageAlign.TOP_LEFT;
        stage.scaleMode = StageScaleMode.NO_SCALE;
        stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE;
        stage.color = 0xC02A2A; // red

        // Create fullscreen window on second monitor (check if available first)
        if (Screen.screens[1]) {

            // Second window
            var nwio:NativeWindowInitOptions = new NativeWindowInitOptions();
            nwio.systemChrome = NativeWindowSystemChrome.NONE;
            secondWindow = new NativeWindow(nwio);
            secondWindow.bounds = (Screen.screens[1] as Screen).bounds;
            secondWindow.activate();

            // Second window's stage
            secondWindow.stage.align = StageAlign.TOP_LEFT;
            secondWindow.stage.scaleMode = StageScaleMode.NO_SCALE;
            secondWindow.stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE;
            secondWindow.stage.color = 0x387D19; // green   
        }

    //Create array of PRIMARY scenes
        var primary:Array = ["scene1.f4v", "scene2.f4v"];

    //Create array of SECONDARY scenes for scene1
        var secondary1:Array = ["scene1A.f4v", "scene1B.f4v"];

    //Create array of SECONDARY scenes for scene2
        var secondary2:Array = ["scene2A.f4v", "scene2B.f4v"];

    }

    }

}

编辑:用户将使用键盘上的 LEFT 和 RIGHT 循环浏览叠加层,并使用 UP 和 DOWN 循环浏览场景。

【问题讨论】:

    标签: arrays actionscript-3 video flash-builder


    【解决方案1】:

    为每个视频使用通用Object,将每个视频存储在一个数组中,然后将辅助视频存储在每个对象内的数组中:

    var videos:Array = [
        {
             primary:'video1.mp4',
             secondary:[
                 'overlay101.mp4',
                 'overlay102.mp4'
             ]
        },
        {
             primary:'video2.mp4',
             secondary:[
                 'overlay201.mp4',
                 'overlay202.mp4'
             ]
        }
        {
             primary:'video3.mp4',
             secondary:[
                 'overlay301.mp4',
                 'overlay302.mp4'
             ]
        }
    ]
    

    然后,当您播放视频时,您可以循环遍历videos 数组。每个对象都有一个主要视频及其相关的次要视频。您也可以更进一步,使用该对象存储元数据或在 secondary 数组中存储更多 Objects,而不是字符串。

    编辑:快速回复第一条评论

    在面向对象的编程 (OOP) 语言中,一切都是对象。每一个类,每一个函数,每一个循环,每一个变量都是一个对象。类通常扩展一个基类,在 AS3 中称为Object

    Object 是可用的最基本、最原始的对象类型——它只是一个名称:值对的列表,有时也称为字典。因此,您可以执行以下操作:

    var obj:Object = {hello:'world'};
    trace(obj.hello); // output 'world'
    trace(obj['hello']); // output 'world'
    trace(obj.hasOwnProperty('hello')); //output true (obj has a property named 'hello')
    

    我所做的是为每个视频创建这些对象之一,然后将它们保存到一个数组中。所以假设你想追踪primary 并找出secondary 中有多少视频,你可以这样做:

    for (var i:int = 0; i < videos.length; i++) {
        var obj:Object = videos[i];
        trace('Primary: ' + obj.primary); // for video 1, output 'video1.mp4'
        trace('Secondary Length: ' + obj.secondary.length); // for video1, output 2
    }
    

    这应该向您展示如何访问这些值。字典/Object 是关联数据的正确方法,我提供的结构非常简单,但正是您需要的。

    我们谈论的是 OOP 编程的最基本基础(这就是 AS3)和使用点语法,被许多语言(从 AS3 到 JS 到 Java 到 C++ 到 Python)用作一种方式访问存储在其他对象中的对象。在继续之前,您确实需要阅读 OOP 的基础知识。您似乎缺少基础知识,这是编写任何应用程序的关键。

    【讨论】:

    • 乔希,我认为你在引导我朝着正确的方向前进。我正在尝试完全理解您的代码(作为菜鸟)。您创建了一个名为 videos 的数组,然后在该数组中... 我认为所有各种括号都让我感到困惑。您能否再向我解释一下您的代码?谢谢!
    • @user3391426 请查看我添加到答案中的编辑。
    • 我熟悉 OOP 和数据对。我没有做太多的开发,所以我不熟悉你分享的数组。此外,对于我的生活,我不确定如何将关键事件与此联系起来。
    • Josh,我对您进行了一些研究,发现您精通 AS3 和 AIR 应用程序。另外,我看到你是密歇根人。如果您有任何机会想为我签订此演出合同以帮助我完成它,我很乐意收到您的来信。
    【解决方案2】:

    我不能完全理解你想要做什么,但你有没有想过尝试for each 循环?它看起来像......

    prim1();
    
    function prim1():void
    {
        for each (var vid:Video in primary)
        {
            //code to play the primary video here
        }
        for each (var vid:Video in secondary1)
        {
            //code to play the secondary video here
        }
    }
    

    很抱歉,这不是您想要的,但我从问题中了解到,您正在尝试同时播放主要视频和次要视频,以便它们同步。祝你的程序好运^^

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      相关资源
      最近更新 更多