المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : الدرس السادس : تشغيل ملفات الريال بلاير - دورة CSharp 2005


khaledbelal
03-22-2010, 03:32 PM
الدرس السادس

تشغيل ملفات الريل بلاير Playing RM Files

سنستخدم في هذا الدرس الإجراءات كثيراً , ولمزيد من التوضيح عنها أرجع إلى الدرس الرابع
تقنية rm تم تصميمها بواسطة شركة .Real Networks Inc حيث أن لهذه التقنية
مزايا كثيرة من أهمها حجم الملفات الصغير الذي يتيح تداول الملفات عبر الوب بسهولة
في الدروس السابقة تعاملنا مع ملفات الميديا بأي تقنية ما عدا هذه التقنية
ولأن هذه التقنية تختلف تماماً عن التقنيات الأخرى خصصنا لها هذا الدرس.
لتشغيل ملفات rm نحتاج لملفات dll تحتوي على دوال تشغيل rm
الملفات موجودة للتحميل من هنا (http://www.7oma.com/csharp/real.zip)
وهي من شركة Real تم تحويرة قليلاً ليتعامل مع بيئة الدوت نت
في التطبيق سنجد إختلاف بين أوامر rm والأوامر الأخرى لأن شركة Real تحتكر هذه التقنية
ولا تقبل بتوزيعها على الشركات الأخرى لذلك فميكروسوفت لا تدعم تشغيل ملفات rm
فمثلاً كما رأينا في الدرس السابق فان أمر تشغيل ملف صوت أو فيديو عادي هو:

Play();

أما لتشغيل ملف rm فيكون الأمر هكذا

DoPlay();

هذه مقارنه بسيطة بين أوامر ميكروسوفت وأوامر Real

AVI----------------Real
1-FromFile---------SetSource
2-Play-------------DoPlay
3-Stop-------------DoStop
4-Pause------------DoPause
5-Duration---------GetLength
6-CurrentPosition----GetPosition/SetPosition

الأمر الأول يستخدم لتحميل الملف
الأمر رقم 2 يستخدم لتشغيل الملف
الأمر 3 لإيقاف تشغيل الملف نهائياً
الأمر 4 لإيقاف تشغيل الملف مؤقتاً
الأمر 5 لإيجاد طول الملف بالثواني
الأمر 6 لإيجاد مكان التشغيل , أي إيجاد الموقع في الملف الذي يتم تشغيله
مثلاً إذا أنتجت الدالة 60 معنى ذلك أنه يتم الآن تشغيل الثانية رقم 60 من الملف
في أوامر Real هناك أمرين أحدهما لقرائة الموقع والآخر لضبط الموقع
أما في أوامر ميكروسوفت فالقراءة والضبط تستخدم نفس الأمر
سنستخدم في هذا الدرس جميع الأوامر السابقة
يتبع التطبيق في الرد التالي

التطبيق
إفتح تطبيق الدرس السابق
أضف الملف AxInterop.RealAudioObjects.dll الذي قمت بتحميلة إلى المراجع References كما فعلنا في الدرس الرابع
سنضيف في هذا التطبيق كائن عام جديد من نوع مشغل rm
وليكون إسم هذا الكائن rp إختصار لـ Real Player
سنقوم بتعريف هذا الكائن تحت تعريفات كائنات الصوت والصورة في الدرس السابق هكذا:

private AxRealAudioObjects.AxRealAudio rp=new AxRealAudioObjects.AxRealAudio();

لاحظ أن كود تعريف الكائن يختلف قليلاً عن تعريف كائنات ميكروسوفت
بعد تعريف كائن مشغل rm أصبح لدينا ثلاثة كائنات رئيسية
مشغل صوت و مشغل فيديو ومشغل rm وعند فتح ملف جديد
سنبدأ بإختبار هل هو ملف فيديو ثم هل هو ملف صوت ثم هل هوملف rm
وبالتالي سنستخدم جملة try ثلاث مرات متداخلة عند فتح الملف وعند تشغيل الملف
وعند إيقاف تشغيل الملف أو عند تقديم أو تأخير المف ..
وإذا أردنا أختصار الكود لنستخدم جملة try المتداخلة فقط عند فتح الملف
سنستخدمها فقط عند فتح "تحميل الملف" ومنها سنعرف نوع المف , ونقوم بخزن نوع المف
في متغير عام من نوع نص , وعند تشغيل الملف بدلاً من إستخدام try المتداخله كما فعلنا في الدرس السابق
سنفحص نوع الملف من خلال المتغير من نوع نص الذي خزنا فيه نوع الملف عند الفتح
دون إستخدام جملة try وذلك سيسهل كثيرا ويسرع عملية تشغيل الملف والتعامل معه
إذاً سنعرف متغير عام من نوع نص لخزن نوع الملف وليكون إسمه type
نعرف هذا المتغير تحت تعريفات كائن الصوت والفيديو و مشغل rm هكذا:

private string type;

بحيث تصبح المتغيرات العامة هكذا :

http://absba7.absba.org/teamwork8/455943/51.jpg

اذهب إلى التصميم
أضف للنافذة الأساسية زرين زر للإيقاف و زر للإيقاف المؤقت
إذهب إلى كرد البرنامج ..
سنقوم بكتابة إجراء مستقل لتحميل ملف الميديا إلى أحد الكائنات الثلاثة

إجراء تحميل الملف

وهذه الإجراء سيكون مستقله لكي نستطيع إستخدامه في أكثر من مكان
لنسمي هذه الإجراء LoadFile وستكون وظيفته إختبار نوع الملف ثم ضبط قيمة المتغير type
ليحمل حرف يرمز إلى نوع الملف و ايضاً هذالإجراء ستقوم بتحميل الملف للكائن المناسب من الكائنات الثلاثة
الأحرف التي سيحملها المتغير type هي A إذا كان ملف صوت و V إذا كان ملف فيديو وR إذا كان ملف rm
أي أن الإجراء سيفحص نوع الملف فإذا كان ملف صوت سيحمل type الحرف A ويحمل الملف إلى كائن الصوت ap
أما إذا كان فيديو فيحمل type الحرف V ويحمل الملف لكائن الفيديو vp
أما إذا كان الملف rm فيحمل type الحرف R ويحمل الملف لكائن الريل rp
فحص نوع الملف سيكون بنفس الطريقة في الدرس السابق ولكنا سنستخدم try ثلاث مرات متداخلة
أنسخ هذا الكود إلى الشفرة وتأكد أن يكون هذا الكود خارج أي دالة أخرى:

void LoadFile(string Path)
{
StopFile();
ap=null;//تصفير الصوت
vp=null;//تصفير الفيديو
this.Controls.Add(rp);//تصفير الريل
rp.Visible=false;//أخفاء مظهر الريل
try
{
vp = Video.FromFile(Path);
vp.Owner = this.p1;
p1.Width = 400;
p1.Height = 300;
type="V";
}
catch
{
try
{
ap = Audio.FromFile(Path);
type="A";
}
catch
{
try
{
rp.SetSource(Path);
type="R";
}
catch
{
MessageBox.Show("الرجاء إختيار ملف صالح");
type="N";
}
}

}
}

الكود السابق يمثل إجراء فحص الملف وتحملية إلى أحد الكائنات
الإجراء هو جزء من الشفرة يمكن إستخدامه أكثر من مرة من خلال إستدعائه بإسمه فقط
وبما أنه إجراء مستقلة يجب ان تكون خارج أي إجراء أخر:

http://absba7.absba.org/teamwork8/455943/52.jpg

الإجراء يتكون من مدخل واحد Path من نوع نص ويمثل مسار الملف الذي سيتم تحميلة
أي أننا عندما نستدعي الإجراء سنكتب إسمه ونعطيه مدخل من نوع نص مثلاً:

LoadFile("C://s.mp3");

الكود السابق سيقوم بإستدعاء الإجراء و الإجراء سيقوم بفحص وتحميل الملف s.mp3 الموجود في القرص c
ملاحظة: في لغة السي شارب يعتبر حرف \ حرفاً غير مسموح به
لذلك عند كتابة مسار الملف يتم إستبدالة بـ //

في السطر الأول من الإجراء تعلمية StopFile وهي إستدعاء لإجراء أخر سنشرحه فيما بعد
يقوم إجراء StopFile بإيقاف تشغيل أي ملف لكي يتم تحميل ملف جديد بدلاً منه وإذا لم نوقف تشغيل
الملف السابق وقمنا بتحميل ملف آخر سيحدث تداخل في الملفات ويتم تشغيل أكثر من ملف في آن واحد
في السطور 2 و3 و4 و5 كما هو مشروح في الكود يتم تصفير الكائنات
ومعنى التصفير هو إلغاء تحميل الملفات السابقة لكي يتم تحميل ملفات جديدة
بعدها جملة try الأولى تقوم بتحميل كائن الفيديو الملف المدخل من خلال المتغير Path
فإذا تم التحميل بنجاح فإن التعليمة type="V" تقوم بتحميل الحرف V إلى المتغير type
دلالة على أن نوع الملف هو فيديو , أما إذا حدث إي خطأ في التحميل فسوف يقفز المعالج إلى تنفيذ الكود باللون الأخظر
ويتم فيها تحميل الملف لكائن الصوت فإذا تم التحميل بنجاح يتم تحميل المتغير type الحرف A
دلالة على أن نوع الملف هو صوت , أما إذا حدث خطأ في التحميل فالمعالج سيقفز إلى تنفيذ الكود باللون الأحر
ويتم فيه تحميل الملف إلى كائن rm "لاحظ الأختلاف في الأمر عن أوامر الصوت والفيديو"
فإذا تم التحميل بنجاح يتم تحميل المتغير type الحرف R دلالة على أن نوع الملف هو ريل
وإذا حدث خطأ في التحميل يقفز المعالج لتنفيذ الكود باللون البرتقالي حيث يظهر رسالة خطأ
ويحمل المتغير الحرف N دلالة على أن نوع الملف غير معروف .

إجراء تشغيل الملف
سنقوم بكتابة إجراء مستقل أخر لتشغيل الملف , إجراء التشغيل سيكون أسهل بكثير من إجراء تحميل الملف
لان لدينا نوع الملف مخزن في المتغير type ولن نقوم بفحص نوع الملف مرة أخرى
حيث سنقوم بإستخدام تعليمة if لنعرف الحرف الموجود في type ومن خلالة نعرف نوع الملف فنشغل الكائن المطلوب
لنسمي هذا الإجراء PlayFile ولن تكون لهذا الإجراء أي مدخلات
أنسخ هذا الكود إلى الشفرة وتأكد أن يكون خارج أي إجراء أخر :

void PlayFile()
{
if(type=="V")
{
vp.Play();
}
else if(type=="A")
{
ap.Play();
}
else if(type=="R")
{
rp.DoPlay();
}
}

في المقارنة الأولى إذا كان المتغير يحمل الحرف V فهذا يعني أن نوع الملف هو فيديو كما في إجراء التحميل
ولذلك سيتم تشغيل كائن الفيديو vp , إما إذا لم يكن V فينتقل المعالج للمقارنة الثانية وإلا للثالثة

إجراء الإيقاف المؤقت
في هذا الإجراء أيضاً سنستفيد من محتويات المتغير type لتحديد نوع الملف والتعامل مع الكائن المحدد
أنسخ هذا الكود إلى الشفرة وتأكد أن يكون خارج أي إجراء أخر :

void PauseFile()
{
if (type=="V")
{
vp.Pause();
}
else if (type=="A")
{
ap.Pause();
}
else if (type=="R")
{
rp.DoPause();
}
}

لا أظن أنها تحتاج إلى شرح..

إجراء إيقاف التشغيل
أنسخ هذا الكود إلى الشفرة وتأكد أن يكون خارج أي إجراء أخر:

void StopFile()
{
if (type=="V")
{
vp.Stop();
}
else if (type=="A")
{
ap.Stop();
}
else if (type=="R")
{
rp.DoStop();
}
}

هذا هو الإجراء الذي إستدعيناه في إجراء تحميل الملف
لو قمت بتشغيل البرنامج الآن لن يتم تشغيل أي إجراء لأننا لم نستدعي أي منها
إفتح التصميم وإضغط مزدوجاً على زر فتح ملف ميديا , إمسح الكود السابق وأكتب بدلاً عنه:

OF.ShowDialog();
LoadFile(OF.FileName);
PlayFile();

في السطر الأول إستدعينا نافذة فتح الملف
في السطر الثاني إستدعينا إجراء تحميل الملف و حملنا المدخل بناتج كائن فتح الملف
أي أنه في شفرة إجراء التحميل ستكون قيمة المدخل Path هي قيمة OF.FileName
بعد إستدعاء إجراء تحميل الملف استدعينا إجراء تشغيل الملف , أي أنه سيتم تشغيل الملف بمجرد إختياره
إذهب إلى التصميم مجددا واضغط مزدوجاً على زر التشغيل, أمسح الكود السابق وأكتب بدلاً عنه:

PlayFile();

إستدعاء لإجراء التشغيل لا غير
نلاحظ كيف أستدعينا إجراء التشغيل في زر فتح الملف وفي زر التشغيل
اذهب للتصميم واضغط مزدوجاً على زر الإيقاف المؤقت وأكتب فيه هذا الكود:

PauseFile();

اذهب الي التصميم واضغط مزدوجاً على زر الإيقاف وأكتب هذا الكود:

StopFile();

نستطيع الآن أن نقول أن التطبيق يشغل جميع أنواع الملفات

ملاحظة:
عند أستيراد ملف دوال الريل بلاير AxInterop.RealAudioObjects.dll
تقوم بيئة التطوير بإنشاء الملف الآخر كربط بين التطبيق والملف
حيث يتكون الملف Interop.RealAudioObjects.dll
بجانب التطبيق بمجرد تشغيل التطبيق من بيئة التطوير
وهذا الملف ضروري لأنه يعمل كوسيط بين التطبيق وملف دوال الريل
إذا لم تستطيع البيئة تكوين هذا الملف لسبب أو لآخر
يجب ان يوضع بجانب التطبيق
أي أن ملفات dll التي يحتاجها التطبيق أصبحت أربعة ملفات مع ملفات الدروس السابقة

الواجب
أرسل التطبيق..
.نهاية الدرس السادس.

..
7oma

حماة النهضة

..