كيف أقوم بإنشاء كائن فيديو ديناميكيًا في 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.الفيديو ليس تابعًا لـ 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