بسم الله السميع العليم
مقدمة
اود هنا ان اقدم برنامج صغير ... يمثل سرفر لعمل بث فيديو من النوع MJPEG او ما يعرف بالـ Motion-JPEG .... وهو عبارة عن استريم من مجموعة صور JPG ترسل بالتتابع عبر برتوكول الـ HTTP .. إمكانية بث فيديو مباشر من كمبيوترك الى
اي جهاز عميل ... إياً كان مصدر هذ البث : من الشاشة ... او الكاميرا ... او الهارد ديسك ... او اي مصدر آخر تريده.
لماذا MJPEG Streaming بالتحديد ؟
يكمن سبب إختياري للـ MJPEG بالتحديد على الرغم من ان عملية ارسال صور الى جهاز بعيد ممكنة بعدة طرق اسرع و افضل ... السبب هو كون هذا البروتكول مدعوم ضمنيا من قبل عدة برامج وعلى عدة منصات (اجهزة كمبيوتر, اجهزة
ذكية موبيلات , اجهزة لوحية ومعظم كميرات المراقبة IP Cameras تعتمد اغلبها عليه ) ... وذلك لانه يمكنك فتحه بإستخدام اغلب متصفحات الانترنت كالـفايرفوكس او الكروم او مشغل الفي إل سي VLC Player .. إلق نظرة على الصورة
ادناه :
بل يمكن ايضا من هاتفك الذكي ... مثلا آندرويد مع متصفح الفايرفوكس او اي من البرامج المجانية الكثيرة التي يمكن تحميلها من الـ Google Market ... انظر الصورة التالية :
كيف يمكن استخدام المكتبة المرفقة هنا ؟
لن اخوض هنا في تفاصيل الـ 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
سوف يظهر لك شيء مشابه لـ :
بناء مصدر الصور الخاص بك :
في المثال السابق الذكر لاحظ انك لم تحدد ان يكون مصدر بياناتك (الصور والفيديو) هو شاشة كمبيوترك ومع ذلك يفترض السرفر هذا المصدر كمصدر افتراضي للصور عن طريق الخاصية 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 ..
اتمنى للجميع الإستفادة ولنا جلسة اخرى بإذن الله تعالى
السلام عليكم ورحمة الله