سؤال

أردت أن أحصل على بعض الأفكار التي سيتعامل بها مع بعضكم من هذه المشكلة. لقد حصلت على روبوت ، يعمل Linux ويستخدم كاميرا ويب (مع برنامج تشغيل V4L2) كواحد من أجهزة استشعاره. لقد كتبت لوحة تحكم مع GTKMM. يتم كتابة كل من الخادم والعميل في C ++. الخادم هو الروبوت ، العميل هو "لوحة التحكم". يحدث تحليل الصور على الروبوت ، وأود أن أقوم ببث الفيديو من الكاميرا إلى لوحة التحكم لسببين: أ) للمتعة ب) نتائج تحليل الصورة

لذا فإن سؤالي هو ، ما هي بعض الطرق الجيدة لدفق الفيديو من كاميرا الويب إلى لوحة التحكم وكذلك إعطاء الأولوية لرمز الروبوت لمعالجته؟ لست مهتمًا بأنه كتابة مخطط ضغط الفيديو الخاص بي ووضعه من خلال منفذ الشبكات الحالي ، سيكون من الأفضل على ما أعتقد. الجزء الثاني من المشكلة هو كيف يمكنني عرض الفيديو في GTKMM؟ تصل بيانات الفيديو بشكل غير متزامن وليس لدي سيطرة على Main () في GTKMM لذلك أعتقد أن هذا سيكون صعبًا.

أنا منفتح على استخدام أشياء مثل VLC أو Gstreamer أو أي مكتبات ضغط عامة أخرى لا أعرفها.

شكرًا!

تحرير: يحتوي الروبوت على معالج 1 جيجا هرتز ، يدير سطح مكتب مثل إصدار Linux ، ولكن لا يوجد X11.

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

المحلول

يحل Gstreamer كل هذا تقريبًا من أجلك ، مع القليل من الجهد ، ويتكامل أيضًا بشكل جيد مع نظام الأحداث GLIB. يتضمن Gstreamer الإضافات المصدر V4L ، وعناصر الإخراج GTK+ ، ومرشحات مختلفة لتغيير حجم / تشفير / فك تشفير الفيديو ، والأفضل من ذلك كله ، بالوعة الشبكة والمصادر لتحريك البيانات بين الآلات.

بالنسبة إلى النموذج الأولي ، يمكنك استخدام أداة "GST-Launch" لتجميع خطوط أنابيب الفيديو واختبارها ، ثم ببساطة إنشاء خطوط أنابيب برمجيًا في الكود الخاص بك. ابحث عن "Gstreamer Network Streaming" لمعرفة أمثلة على الأشخاص الذين يقومون بذلك باستخدام كاميرات الويب وما شابه.

نصائح أخرى

لست متأكدًا من التقنيات الفعلية المستخدمة ، ولكن هذا قد ينتهي به المطاف إلى أن يكون مزامنة ضخمة ***** إذا كنت ترغب في تجنب الإطارات المتساقطة. كنت أقوم ببث مقطع فيديو إلى ملف وشبكة في نفس الوقت. ما انتهى بي الأمر في النهاية هو استخدام مخزن مؤقت دائري كبير مع ثلاثة مؤشرات: واحد الكتابة وقراءة اثنين. كان هناك ثلاثة مؤشرات ترابط تحكم (وبعض خيوط الترميز الإضافية): واحد يكتب إلى المخزن المؤقت الذي سيتوقف إذا وصلت إلى نقطة في المخزن المؤقت لا يقرأه كل من الآخرين ، واثنين من روابط القارئ التي من شأنها أن تقرأ من المخزن المؤقت والكتابة إلى الملف/الشبكة (والتوقف مؤقتًا إذا تقدموا بالمنتج). نظرًا لأن كل شيء كتب وقراءة الإطارات ، يمكن الاحتفاظ بالمزامنة النفقات العامة إلى الحد الأدنى.

كان منتجي ترميزًا (من مصدر ملف آخر) ، ولكن في حالتك ، قد ترغب في إنتاج الكاميرا إطارات كاملة بأي شكل من الأشكال التي تقوم بها عادةً وتفعل الترميز (مع شيء مثل FFMPEG) للخادم ، في حين أن الروبوت يعالج الصورة.

مشكلتك أكثر تعقيدًا بعض الشيء ، لأن الروبوت يحتاج إلى ملاحظات في الوقت الفعلي ، لذا لا يمكن التوقف وانتظر خادم البث. لذلك قد ترغب في الحصول على إطارات إلى نظام التحكم في أسرع وقت ممكن وتجاوز بعضها في المخزن المؤقت الدائري بشكل منفصل للبث إلى "لوحة التحكم". بعض برامج الترميز معالجة الإطارات المتساقطة أفضل من غيرها ، لذلك إذا تخلفت الشبكة عنك ، فيمكنك بدء كتابة إطارات في نهاية المخزن المؤقت (مع الحرص على عدم قراءتها).

عندما تقول "منفذ فيديو جديد" ثم ابدأ في الحديث عن VLC/Gstreaming ، أجد صعوبة في تحديد ما تريد. من الواضح أن حزم البرامج هذه ستساعد في بث وضغط عبر عدد من البروتوكولات ، لكن من الواضح أنك ستحتاج إلى "منفذ شبكة" وليس "منفذ فيديو" لإرسال الدفق.

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

الانتقال. لقد قمت بالكثير من البث عبر بروتوكولات MMS/UDP و VLC يعالجها بشكل جيد للغاية (كخادم وعميل). ومع ذلك ، تم تصميمه لأجهزة الكمبيوتر المكتبية وقد لا يكون خفيف الوزن كما تريد. شيء مثل Gstreamer أو Mencoder أو FFMPEG في متناول اليد سيكون أفضل على ما أعتقد. أي نوع من وحدة المعالجة المركزية التي يمتلكها الروبوت؟ ستحتاج إلى القليل من النخر إذا كنت تخطط للضغط في الوقت الفعلي.

على جانب العميل ، أعتقد أنك ستجد عددًا من الأدوات المصغرة للتعامل مع الفيديو في GTK. كنت أنظر في ذلك قبل القلق بشأن تفاصيل الواجهة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top