Как динамически создать объект Video в AS2 и добавить его в MovieClip?

Мне нужно динамически создать объект Video в ActionScript 2 и добавить его в клип. В AS3 я просто делаю это:

var videoViewComp:UIComponent; // created elsewhere    

videoView = new Video();
videoView.width = 400;
videoView.height = 400;
this.videoViewComp.addChild(videoView);

К сожалению, я не могу понять, как это сделать в AS2. Видео не является дочерним элементом MovieClip, так что attachMovie(), похоже, ничего мне не дает. Я также не вижу эквивалента методу AS3 UIComponent.addChild().

Есть ли способ динамически создать объект Video в AS2, который действительно отображается на сцене?


Хотя мне потенциально нужно несколько видео одновременно. Можно ли дублировать этот видеообъект?

Я думаю, что у меня есть другое решение. Это не оптимально, но согласуется с некоторыми вещами, которые я должен сделать для других компонентов, так что это не слишком неуместно в проекте. Как только разберусь, напишу здесь, что сделал.


person Herms    schedule 09.09.2008    source источник


Ответы (5)


Хорошо, у меня что-то работает.

Сначала я создал новый символ библиотеки и назвал его «VideoWrapper». Затем я добавил к нему один объект Video с идентификатором «video».

Теперь, когда мне нужно динамически добавить видео в свое состояние, я могу использовать MovieClip.attachMovie(), чтобы добавить новую копию объекта Video.

Чтобы упростить задачу, я написал класс VideoWrapper, который предоставляет базовую обработку элементов пользовательского интерфейса (setPosition(), setSize() и т. д.). Поэтому при работе с видео в обычном коде макета пользовательского интерфейса я просто использую эти методы, чтобы он выглядел так же, как и все другие элементы пользовательского интерфейса. При работе с видео я просто обращаюсь к члену класса «видео».

Моя фактическая реализация немного сложнее, но это основы того, как я заработал. У меня есть тестовое приложение, которое воспроизводит 2 видео, одно с локальной камеры и одно потоковое с FMS, и оно отлично работает.

person Herms    schedule 10.09.2008

Чтобы отправить вам концы строки, которая является тегом, я использую объекты символов 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;

    //}
}
person Tonio FERENER-VARI    schedule 02.12.2010

Я рекомендую вам создать один экземпляр объекта Video, оставить его невидимым (т. е. videoview.visible = false) и загружать клип, когда он вам нужен, отображая его в нужное время. Вы также можете использовать swapDepth(), если это необходимо.

Обработка видео в AS2 не самая лучшая вещь. Будьте уверены, вы столкнетесь с множеством мелких проблем (зацикливание без пробелов и т. д.).

person Pedro    schedule 10.09.2008

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

person paranoio    schedule 19.09.2008

Я надеюсь, что приведенный ниже код будет очень полезен для вас:

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
person Tonio FERENER-VARI    schedule 30.08.2010
comment
Итак, этот код, если я не ошибаюсь, прикрепляет существующий мувиклип (откуда?) с именем VideoDisplay с видео, переброшенным на его сцену? Или я что-то пропустил здесь? Есть ли способ сделать это полностью динамически, или все сводится к перетаскиванию вещей на сцену? - person Danny Staple; 09.11.2010