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

StackOverflow https://stackoverflow.com/questions/52732

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top