我正在使用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循环切换叠加层,并使用向上和向下循环播放场景。
答案 0 :(得分:2)
为每个视频使用通用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
数组。每个对象都有一个主视频及其关联的辅助视频。您可以更进一步,并使用该对象存储元数据或在Object
数组中存储更多secondary
,而不是字符串。
编辑:对第一条评论的快速回复
在面向对象编程(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的基础知识。你似乎错过了基础知识,这是编写任何应用程序的关键。
答案 1 :(得分:0)
我无法完全理解您尝试做的事情,但您是否考虑过尝试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
}
}
很抱歉,如果它不是您想要的,但我从问题中理解的是,您尝试同时播放主要和次要视频,以便他们进入同步。祝你的节目好运^^