Как мне динамически создать видеообъект в AS2 и добавить его в MovieClip?
-
09-06-2019 - |
Вопрос
Мне нужно динамически создать видеообъект в ActionScript 2 и добавить его в видеоклип.В AS3 я просто делаю это:
var videoViewComp:UIComponent; // created elsewhere
videoView = new Video();
videoView.width = 400;
videoView.height = 400;
this.videoViewComp.addChild(videoView);
К сожалению, я не могу понять, как это сделать в AS2.Video не является дочерним элементом MovieClip, поэтому attachMovie(), похоже, ничего мне не дает.Я также не вижу никакого эквивалента методу UIComponent.addChild() от AS3.
Есть ли какой-нибудь способ динамически создать видеообъект в AS2, который действительно отображается на сцене?
Однако потенциально мне нужно несколько видео одновременно.Возможно ли дублировать этот видеообъект?
Я думаю, у меня есть другое работающее решение.Это не оптимально, но это согласуется с некоторыми вещами, которые я должен сделать для других компонентов, так что это не слишком неуместно в проекте.Как только я с этим разберусь, я опубликую то, что я сделал здесь.
Решение
Ладно, у меня кое-что работает.
Сначала я создал новый библиотечный символ и назвал его "VideoWrapper".Затем я добавил к нему один видеообъект с идентификатором "video".
Теперь, в любой момент, когда мне нужно динамически добавить видео в мое состояние, я могу использовать MovieClip.attachMovie(), чтобы добавить новую копию видеообъекта.
Чтобы упростить задачу, я написал класс VideoWrapper, который предоставляет базовую обработку элементов пользовательского интерфейса (setPosition(), setSize() и т.д.).Поэтому, когда я работаю с Видео в обычном коде макета пользовательского интерфейса, я просто использую эти методы, чтобы оно выглядело так же, как все остальные мои элементы пользовательского интерфейса.Когда я работаю с видео, я просто обращаюсь к члену класса "video".
Моя фактическая реализация немного сложнее, но это основы того, как я заставляю все работать.У меня есть тестовое приложение, которое воспроизводит 2 видео, одно с локальной камеры и одно потоковое из FMS, и оно отлично работает.
Другие советы
Чтобы отправить вам концы строки, которая является тегом, я использую объекты символов HTML из школы w3schools
Пример, взятый из проекта, может быть следующим:
< asset path="library\video.swf" />
Строка выше показывает, что существует каталог под названием library, который содержит файл video.swf
Кроме того, в библиотеке каталогов есть файл video.xml.Этот файл содержит следующие строки
<xml version="1.0" encoding="utf-8" >
<movie version="7">
<frame>
<library>
<clip id="VideoDisplay">
<frame>
<video id="VideoSurface" width="160" height="120" />
<place id="VideoSurface" name="video" />
</frame>
</clip>
</library>
</frame>
</movie>
Давным-давно мой сын Алекс скачал код класса VideoDisplay и библиотеку каталогов из Интернета
Я утвердил код класса VideoDisplay.
написав 2 участника
public function pos():Number
{
return ns.time;
}
public function close():Void
{
return ns.close();
}
Программа, которую я создал
это
нечто большее, чем просто исследователь и презентер .flv
Файлы
Он также
является проводником и презентером выбранных фрагментов каждого .flv
файл
Теперь код класса VideoDisplay выглядит следующим образом:
class util.VideoDisplay
{
//{ PUBLIC MEMBERS
/**
* Create a new video display surface
*/
function VideoDisplay(targetURI:String, parent:MovieClip, name:String, depth:Number, initObj)
{
display = parent.attachMovie("VideoDisplay", name, depth, initObj);
// create video stream
nc = new NetConnection();
nc.connect(targetURI);
ns = new NetStream(nc);
// attach the video stream to the video object
display.video.attachVideo(ns);
}
/**
* Video surface dimensions
*/
function setSize(width:Number, heigth:Number):Void
{
display.video._width = width;
display.video._height = heigth;
}
/**
* Video clip position
*/
function setLocation(x:Number, y:Number):Void
{
display._x = x;
display._y = y;
}
/**
* Start streaming
* @param url FLV file
* @param bufferTime Buffer size (optional)
*/
public function play(url:String, bufferTime:Number):Void
{
if (bufferTime != undefined) ns.setBufferTime(bufferTime);
ns.play(url);
}
/**
* Pause streaming
*/
public function pause():Void
{
ns.pause();
}
/**
* Seek position in video
*/
public function seek(offset:Number):Void
{
ns.seek(offset);
}
/**
* Get position in video
*/
public function pos():Number
{
return ns.time;
}
public function close():Void
{
return ns.close();
}
//}
//{ PRIVATE MEMBERS
private var display:MovieClip;
private var nc:NetConnection;
private var ns:NetStream;
//}
}
Я рекомендую вам создать один экземпляр видеообъекта, оставив его невидимым (т. е., videoview.visible = false
), и загружайте клип, когда он вам понадобится, отображая его в соответствующее время.Вы также можете использовать swapDepth()
если это станет необходимым.
Обработка видео в AS2 - не самая лучшая вещь на свете.Будьте уверены, вы столкнетесь с множеством мелких проблем (зацикливание без пробелов и т.д.).
ваш подход - это то, что я обычно делаю, потому что другой вариант - включить UIComponent mediaDisplay в библиотеку, а затем присоединить этот компонент с помощью attachMovie, но я обнаружил, что mediaDisplay немного глючит, поэтому я предпочитаю использовать примитивный экземпляр video.
Я надеюсь, что приведенный ниже код будет вам очень полезен:
import UTIL.MEDIA.MEDIAInstances
class Main
{
static function main() {
var MEDIAInstancesInstance :MEDIAInstances = new MEDIAInstances ();
_root.Video_Display.play ("IsothermalCompression.flv", 0);
_root.VideoDisplayMC.onPress = function() {
_root.Video_Display.seek (0);
} // _root.displayMC.onPress = function() {
} // static function main()
} // class Main
//
import UTIL.MEDIA.VideoDisplay
class UTIL.MEDIA.MEDIAInstances
{
function MEDIAInstances()
{
// depth
_root.createEmptyMovieClip ("VideoDisplayMC", 500);
//
var Video_Display:VideoDisplay
=
new VideoDisplay(_root.VideoDisplayMC, "Video_Display", 1);
Video_Display.setLocation(400, 0); Video_Display.setSize (320, 240);
//
_root.Video_Display = Video_Display; _root.VideoDisplayMC._alpha = 75;
} // MEDIAInstances()
} // class UTIL.MEDIA.MEDIAInstances
//
class UTIL.MEDIA.VideoDisplay
{
private var display:MovieClip, nc:NetConnection, ns:NetStream;
function VideoDisplay(parent:MovieClip, name:String, depth:Number)
{
display = parent.attachMovie("VideoDisplay", name, depth);
nc = new NetConnection(); nc.connect(null); ns = new NetStream(nc);
display.video.attachVideo(ns);
}
function setSize(width:Number, heigth:Number):Void
{ display.video._width = width; display.video._height = heigth;}
function setLocation(x:Number, y:Number):Void { display._x = x; display._y = y;}
public function play(url:String, bufferTime:Number):Void
{
if (bufferTime != undefined) ns.setBufferTime(bufferTime); ns.play(url);
}
//
public function pause():Void { ns.pause();}
//
public function seek(offset:Number):Void { ns.seek(offset); }
} // UTIL.MEDIA.VideoDisplay