Как мне динамически создать объект Video в AS2 и добавить его в MovieClip? - PullRequest
2 голосов
/ 09 сентября 2008

Мне нужно динамически создать объект 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 (), похоже, ничего мне не дает. Я также не вижу эквивалента методу ASIC UIComponent.addChild ().

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


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

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

Ответы [ 5 ]

1 голос
/ 02 декабря 2010

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

    //}
}
1 голос
/ 10 сентября 2008

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

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

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

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

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

0 голосов
/ 30 августа 2010

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

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
0 голосов
/ 19 сентября 2008

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

0 голосов
/ 10 сентября 2008

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

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

...