رغيد الطيب

مكتبة لعمل MJPEG Streaming .. لبث فيديو من سطح مكتبك!

4 ردود في هذا الموضوع

بسم الله السميع العليم

مقدمة

اود هنا ان اقدم برنامج صغير ... يمثل سرفر لعمل بث فيديو من النوع MJPEG او ما يعرف بالـ Motion-JPEG .... وهو عبارة عن استريم من مجموعة صور JPG ترسل بالتتابع عبر برتوكول الـ HTTP .. إمكانية بث فيديو مباشر من كمبيوترك الى

اي جهاز عميل ... إياً كان مصدر هذ البث : من الشاشة ... او الكاميرا ... او الهارد ديسك ... او اي مصدر آخر تريده.

لماذا MJPEG Streaming بالتحديد ؟

يكمن سبب إختياري للـ MJPEG بالتحديد على الرغم من ان عملية ارسال صور الى جهاز بعيد ممكنة بعدة طرق اسرع و افضل ... السبب هو كون هذا البروتكول مدعوم ضمنيا من قبل عدة برامج وعلى عدة منصات (اجهزة كمبيوتر, اجهزة

ذكية موبيلات , اجهزة لوحية ومعظم كميرات المراقبة IP Cameras تعتمد اغلبها عليه ) ... وذلك لانه يمكنك فتحه بإستخدام اغلب متصفحات الانترنت كالـفايرفوكس او الكروم او مشغل الفي إل سي VLC Player .. إلق نظرة على الصورة

ادناه :

post-40889-014820000 1335303092_thumb.pn

بل يمكن ايضا من هاتفك الذكي ... مثلا آندرويد مع متصفح الفايرفوكس او اي من البرامج المجانية الكثيرة التي يمكن تحميلها من الـ Google Market ... انظر الصورة التالية :

post-40889-035700500 1335303066_thumb.pn

كيف يمكن استخدام المكتبة المرفقة هنا ؟

لن اخوض هنا في تفاصيل الـ MJPEG ولكنني سوف اوضح كيفية استغلال البرنامج المرفق هنا لبث سلسة من الصور على شكل فيديو يمكن عرضه من اي جهاز بعيد.

الفئة الاساسية في برنامجنا وهي الـ ImageStreamingServer وتحتوي هذه الفئة على أمرين methods و ثلاثة خصائص properties :

الوظائف أو الأوامر :


1 - Start() : تشغيل السرفر على منفذ معين.
2 - Stop() : إيقاف تشغيل السرفر و اغلاق كل الإتصالات الحالية.

و الخصائص التالية :


1 - ImagesSource : مصدر الصور التي سيتم عمل استريمنج لها و إرسالها الى اي عميل يطلبها.
2 - Interval : المدة الزمينة التي ينبغي على السرفر الانتظار فيها بعد كل صورة يرسلها.
3 - IsRunning : يمكن بواسطتها معرفة اذا كان السرفر شغال حاليا ام لا.
4 - Cleints : يعيد لك مصفوفة بكل الاتصالات النشطة حاليا.

مثال :

لكي نجعل السرفر يقوم ببث فيديو عن سطح مكتبنا الحالي الى اي جهاز (سوف نحتاج الى كود مكون من سطرين برمجيين فقط بإستخدام هذه المكتبة !!) ... ImageStreamingServer كالتالي :


ImageStreamingServer server = new ImageStreamingServer();
server.Start(8080);

والان لكي تتصل بالسرفر من الجهاز الحالي او جهاز بعيد .... افتح متصفح الانترنت جوجل كروم او فايرفكس (لأن الانترنت اكسبلور من مايكروسوفت حاليا لايدعمه بشكل مباشر انما يمكن عن طريق بعض الاضافات) .... بعد فتح متصفحك

اكتب اسم كمبيوترك او عنوان الاي بي متبوعا بـنقطتين فوق بعض (:) ثم رقم المنفذ (وهو في حالتنا السابقة 8080) :


http://127.0.0.1:8080

سوف يظهر لك شيء مشابه لـ :

post-40889-034572800 1335303121_thumb.pn

بناء مصدر الصور الخاص بك :

في المثال السابق الذكر لاحظ انك لم تحدد ان يكون مصدر بياناتك (الصور والفيديو) هو شاشة كمبيوترك ومع ذلك يفترض السرفر هذا المصدر كمصدر افتراضي للصور عن طريق الخاصية ImageSource و التي هي من النوع


IEnumerable<Image>

ولنفترض انك تريد ان تجعل مصدر الصور ... الكميرا او مجموعة صور الـ JPG في مجلد معين داخل الجهاز ... ينبغي ان تقوم ببناء دالة معينة تقوم بذلك ... كالتالي :


IEnumerable<Image> CameraImagesSource()
{
// هنا ينبغي ان تكتب الشفرة التي تعيد الصور من الكميرا
}

IEnumerable<Image> FolderImagesSource(string path)
{
// هنا ينبغي ان يكون الكود الذي يعيد الصور من المسار المعين
}

وكمثال عملي تخيل انني اريد ان اقوم ببناء مصدر بيانات لجميع صور ال *.jpg في مجلد معين فإنني ساكتب كود كالتالي :


private IEnumerable<Image> FolderImagesSource(string path)
{
var files = System.IO.Directory.GetFiles(path, "*.jpg");

foreach (var file in files)
yield return Image.FromFile(file);

yield break;
}

private void Form1_Load(object sender, EventArgs e)
{
var source = FolderImagesSource(@"C:\Pictures\");

_Server = new ImageStreamingServer();
_Server.ImagesSource = source;
_Server.Start(8080);
}

في الكود السابق الدالة FolderImagesSource تعيد جميع الصور الموجودة في المجلد "C:\pictures" وفي بداية تشغيل الفورم نقوم بإنشاء كائن من النوع ImageStreamingServer ليمثل سرفرنا و الذي غيرنا الخاصية ImagesSource

التابعة له كي تكون عبارة عن الصور الراجعة من الدالة FolderImagesSource ثم قمنا بتشغيل السرفر عن طريق الدالة Start.

طبعا الكود السابق يمكن اختصاره كثيرا ... كالتالي


var source = System.IO.Directory.GetFiles(@"C:\Pictures\", "*.jpg").Select(s => Image.FromFile(s));
_Server = new ImageStreamingServer(source);
_Server.Start(8080);

في الاصدارات القادمة بإذن الله تعالى .... سنضيف دعم الكاميرا .... او نافذة معينة او فيديو من برنامج معين او منطقة في الشاشة ... بحيث يتم بثها بواسطة الـ MJPEG Streaming ..

اتمنى للجميع الإستفادة ولنا جلسة اخرى بإذن الله تعالى

السلام عليكم ورحمة الله

rtaVideoStreamer-src.zip

تم تعديل بواسطه رغيد الطيب
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا لك موضوع مميز يستحق التثبيت

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا لكي على هذا الموضوع الرائع والمفيد لكن لي سؤال هل يمكن اسنخدام نفس طريقتك لكن على الصوت بدلا من الصوره

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ألف شكر أخي الكريم على هذا الموضوع الجميل

ويا ليت لو تكمل عن طريقة ربط البرنامج بالكاميرا

واجهتني مشاكل مع الكاميرا

وجزاك الله خيرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .