كيف أقوم بإنشاء كائن فيديو ديناميكيًا في 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.الفيديو ليس تابعًا لـ MovieClip، لذلك يبدو أن AttachMovie () لا يحصل على أي شيء.لا أرى أي ما يعادل طريقة UIComponent.addChild() الخاصة بـ AS3 أيضًا.

هل هناك أي طريقة لإنشاء كائن فيديو ديناميكيًا في AS2 والذي يظهر فعليًا على المسرح؟


من المحتمل أن أحتاج إلى مقاطع فيديو متعددة في وقت واحد.هل من الممكن تكرار كائن الفيديو هذا؟

أعتقد أن لدي حل آخر يعمل.إنها ليست مثالية، ولكنها تتناسب مع بعض الأشياء التي يجب أن أفعلها للمكونات الأخرى، لذا فهي ليست في غير محلها في المشروع.بمجرد أن أعرف ذلك سأقوم بنشر ما فعلته هنا.

هل كانت مفيدة؟

المحلول

حسنًا، لدي شيء يعمل.

أولاً، قمت بإنشاء رمز مكتبة جديد وأطلق عليه اسم "VideoWrapper".قمت بعد ذلك بإضافة كائن فيديو واحد إلى ذلك بمعرف "فيديو".

الآن، في أي وقت أحتاج فيه إلى إضافة فيديو ديناميكيًا إلى حالتي، يمكنني استخدام MovieClip.attachMovie() لإضافة نسخة جديدة من كائن الفيديو.

لتسهيل الأمور، كتبت فئة VideoWrapper التي تعرض التعامل الأساسي مع عناصر واجهة المستخدم (setPosition()، setSize()، وما إلى ذلك).لذلك، عند التعامل مع الفيديو في كود تخطيط واجهة المستخدم العادي، أستخدم هذه الأساليب فقط حتى يبدو تمامًا مثل جميع عناصر واجهة المستخدم الأخرى.عند التعامل مع الفيديو، أقوم فقط بالوصول إلى عضو "الفيديو" في الفصل.

التنفيذ الفعلي الخاص بي أكثر تعقيدًا بعض الشيء، ولكن هذه هي أساسيات كيفية عمل الأشياء.لدي تطبيق اختباري يقوم بتشغيل مقطعي فيديو، أحدهما من الكاميرا المحلية والآخر يبث من FMS، وهو يعمل بشكل رائع.

نصائح أخرى

لإرسال نهايات السطر الذي يمثل علامة، أستخدم كيانات رموز HTML من w3schools

مثال مأخوذ من المشروع سيكون كما يلي:

< asset path="library\video.swf" />

يوضح السطر أعلاه وجود دليل يسمى المكتبة والذي يحتوي على الملف 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>

منذ فترة طويلة قام ابني Alex بتنزيل كود فئة 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 به بعض الأخطاء لذا أفضل استخدام مثيل الفيديو البدائي.

آمل أن يكون الكود أدناه مفيدًا جدًا لك:

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