قم ببث فيديو h264 بدون تحويل الشفرة من كاميرا Logitech C920



لم يكن التأخير أكثر من 0.3 ثانية ، نظرًا لأن الكاميرا متصلة بجهاز BeagleBone Blue الضعيف مع حمولة معالج لا تزيد عن 30٪ ويتم نقل دفق الفيديو عبر جهاز توجيه wifi إلى جهاز كمبيوتر محمول.

في البداية ، كانت المهمة هي بث الفيديو من الروبوت إلى كمبيوتر كبير دون تحميل المعالج على الروبوت وبدون تأخير. في عملية الكاميرات وبرامج googling لهذه المهمة ، وجد أن هناك كاميرات مع ترميز الفيديو المستند إلى الأجهزة على الكاميرا نفسها ، وبعد ذلك تم شراء كاميرا Logitech C920. وبدأت الاختبارات والتجارب ، حيث تم العثور على خيارين للترجمة دون تحويل الشفرة.

يتم فحص جميع الإجراءات الإضافية على Ubuntu 16.04 ، وربما يعمل الخيار الثاني على نظام التشغيل Windows

أجهزة البث ترميز الفيديو من كاميرا Logitech C920 عبر cvlc و v4l2


clvc - خادم بث الفيديو عبر vlc من سطر الأوامر.

الأجهزة ترميز دفق الفيديو


تعيين كاميرات pixelformat على H264

v4l2-ctl --device=/dev/video1 --set-fmt-video=width=800,height=600,pixelformat=1 

اختبار H264 باستخدام vlc ، لذلك لن يقوم بإعادة تعيين الإعدادات:

 cvlc v4l2:///dev/video1 --demux h264 

إذا جربت ذلك ، فسيقوم vlc بإعادة تعيين الإعدادات قبل التشغيل:

 cvlc v4l2:///dev/video1:chroma=h264 

يعمل التشغيل. نحصل على تيار H264 من الكاميرا. الآن دعنا نمر عبر الشبكة عبر HTTP:

 cvlc v4l2:///dev/video1:chroma=h264:width=800:height=600 --sout '#standard{access=http,mux=ts,dst=localhost:8080,name=stream,mime=video/ts}' -vvv 

(على الشبكة ، تحتاج إلى استخدام عنوان IP لجهازك المحلي بدلاً من المضيف المحلي)

إطلاق المتلقي:

 mplayer http://localhost:8080/ 

اتضح أن MPEG-TS يسمح للاعب بالاتصال بالدفق في أي وقت بتأخير طفيف (ربما ينتظر إطارًا رئيسيًا أو sth).

إذا كنت تستخدم mux = avi، mime = video / avi ، فستحتاج إلى تشغيل mplayer في اللحظة التي تبدأ فيها تشغيل vlc ، وإلا فلن يبدأ mplayer في اللعب.

خطأ Ffmpeg


  • إذا حاولت تشغيل ffmpeg بدلاً من vlc ، فربما تواجه هذه المشكلة: ffmpeg.org/trac/ffmpeg/ticket/1387
  • بمجرد تشغيل ffmpeg ، سيتم التبديل إلى "Video: rawvideo (YUY2 / 0x32595559)"
  • أثناء قبول MJPEG ، لن يعمل مع H.264
  • يحدث الشيء نفسه عند استخدام qv4l2: بدء الالتقاط في وضع H264 يمنحك بالفعل نافذة فيديو YUY2

تشغيل الفيديو الذي تم فك ترميز الأجهزة


Mplayer قادر على تشغيل Framebuffer ، تأكد من أن X لا يعمل وأدخل:

 mplayer http://192.168.1.100:8080/ -fs -framedrop -vo fbdev 

يمكنك أيضًا اللعب في نافذة X إذا كنت تريد: تشغيل X من سطر الأوامر:

 Xorg -retro &> /dev/zero 

هناك الكثير من رسائل خطأ fbdev التي نسقطها بصمت / dev / zero

تشغيل دفق فيديو من مصدر LAN vlc (انظر القسم أعلاه):

 DISPLAY=":0" mplayer http://192.168.1.100:8080/ -fs -framedrop 

  • إذا فعلنا ذلك ، فسنلاحظ أننا لا نستخدم Xvideo أو أي تسريع للأجهزة حتى الآن
  • يبدو أن linux-sunxi.org/CedarX تزودنا بمكتبة VPU ، وهي للأسف شيء غير آمن من Allwinner
  • ولكن هناك VLC مخترق يمكنه استخدامه: linux-sunxi.org/VLC
  • جمعت بنجاح

التوت بي


في حالة مواجهة قطع أثرية في الصورة ، وتيارات من Raspberry Pi تستخدم:

 cvlc v4l2:///dev/video0:chroma=h264 ... 

قد تحتاج إلى تحديث البرنامج الثابت:

 apt-get install rpi-update raspi-config rpi-update reboot 

ملخص البث عبر cvlc و v4l2


أظهرت الاختبارات أن حمل المعالج على Beaglebone Blue لا يزيد عن 30 ٪ ، وهو أمر جيد جدًا للمعالج الضعيف ، ولكن ليس من الواضح كيفية دفع هذا الفيديو إلى ROS.

إذا لم يكن النطاق الترددي لشبكة wifi كافيًا ، فإن تأخير الفيديو يزداد بشكل كبير ، نظريًا يمكن حل ذلك عن طريق التبديل من TCP إلى UDP ، تشير وثائق cvlc إلى إمكانية البث عبر UDP.

قامت أجهزة البث بترميز الفيديو من كاميرا Logitech C920 عبر Gstreamer


مقالة مطور أصلية تدعم هذه الطريقة في Gstreamer.
قم بتثبيت gstreamer على Ubuntu 16.04

 sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools sudo apt-get install libgstreamer-plugins-base1.0-dev 

يتيح لك مصدر uvch264src:


  • التقط في نفس الوقت دفق فيديو مشفر لأجهزة h264 ودفق فيديو زاحف.
  • تكوين تشفير فيديو الأجهزة (معدل البت ، الإطارات الرئيسية والمزيد)

مصدر عدسة الكاميرا الثانوي هو مفهوم مثير للاهتمام. بالإضافة إلى دفق H.264 الرئيسي ، يمكنك الحصول على دفق ثانوي منخفض الدقة بتنسيق MJPG أو YUV. لست متأكدًا مما إذا كانت هذه ميزة لكاميرا gstreamer أو برنامج التشغيل أو كتلة المصدر ، لكنني آمل أن تكون مفيدة لكاميرات Beaglebone ، بشرط ألا تستخدم الوظيفة معالجًا كبيرًا جدًا للتحويل بين الخام و jpg.

فيما يلي مثال لخط أنابيب يعرض دفق H.264 عالي الدقة ودفق معين المنظر:

 gst-launch-1.0 -v -e uvch264src device=/dev/video0 name=src auto-start=true src.vfsrc ! queue ! video/x-raw,format=YUY2,width=320,height=240,framerate=10/1 ! xvimagesink sync=false src.vidsrc ! queue ! video/x-h264,width=1280,height=720,framerate=30/1 ! h264parse ! avdec_h264 ! xvimagesink sync=false 

يتم فك ترميز التدفق الأساسي H.264 باستخدام كتلة avdec_h264 ، التي يمكن الوصول إليها من خلال حزمة gst-libav ، انظر الملاحظات على ويكي oz9aec . يمكن توصيل لوحة عدسة الكاميرا بالرابط fakelink إذا لم تكن هناك حاجة إليها ، ولكن لا أعتقد أنه يمكن تعطيلها (لا يزال بإمكانك تعطيلها). على الأقل هذا هو الانطباع بأنني أقرأ منشور مدونة KaKaRoTo الأصلي.

من المحتمل أن تكون زائدًا عندما ترى عددًا كبيرًا من المعلمات التي يمكن تكوينها لكتلة المصدر هذه:

 gst-inspect-1.0 uvch264src 

قائمة المعلمات Uvch264src
تفاصيل المصنع:
مرتبة لا شيء (0)
مصدر طويل UVC H264
مصدر / فيديو كلاس
الوصف مصدر كاميرا ترميز UVC H264
المؤلف يونس العلوي <youness.alaoui@collabora.co.uk>

تفاصيل البرنامج المساعد:
اسم uvch264
وصف H264 متوافق مع كاميرات ترميز المساعد البرنامج المساعد
اسم الملف / usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstuvch264.so
الإصدار 1.8.3
ترخيص LGPL
الوحدة النمطية المصدر- gst-plugins-bad
تاريخ إصدار المصدر 2016-08-19
الحزمة الثنائية GStreamer Bad Plugins (Ubuntu)
عنوان URL الأصلي launchpad.net/distros/ubuntu/+source/gst-plugins-bad1.0

GObject
+ ---- GInitially غير معروف
+ ---- GstObject
+ ---- GstElement
+ ---- GstBin
+ ---- GstBaseCameraSrc
+ ---- GstUvcH264Src

الواجهات المنفذة:
Gstchildproxy

قوالب الوسادة:
قالب SRC: "vidsrc"
التوفر: دائما
القدرات:
فيديو / x-raw
التنسيق: {I420، YV12، YUY2، UYVY، AYUV، RGBx، BGRx، xRGB، xBGR، RGBA، BGRA، ARGB، ABGR، RGB، BGR، Y41B، Y42B، YVYU، Y444، v210، v216، NV12، NV21، NV16 و NV61 و NV24 و GRAY8 و GRAY16_BE و GRAY16_LE و v308 و RGB16 و BGR16 و RGB15 و BGR15 و UYVP و A420 و RGB8P و YUV9 و YVU9 و IYU1 و ARGB64 و AYUV64 و r210 و I420_1010 و I420_1010 و I420_1010 ، GBR ، GBR_10LE ، GBR_10BE ، NV12_64Z32 ، A420_10LE ، A420_10BE ، A422_10LE ، A422_10BE ، A444_10LE ، A444_10BE}
العرض: [1، 2147483647]
الارتفاع: [1 ، 2147483647]
فرامرات: [0/1 ، 2147483647/1]
image / jpeg
العرض: [1، 2147483647]
الارتفاع: [1 ، 2147483647]
فرامرات: [0/1 ، 2147483647/1]
فيديو / x-h264
العرض: [1، 2147483647]
الارتفاع: [1 ، 2147483647]
فرامرات: [0/1 ، 2147483647/1]
تنسيق الدفق: {byte-stream، avc}
المحاذاة: au
الملف الشخصي: {مرتفع ، رئيسي ، أساسي ، مقيّد-أساسي}

قالب SRC: "imgsrc"
التوفر: دائما
القدرات:
إفراغ

قالب SRC: 'vfsrc'
التوفر: دائما
القدرات:
فيديو / x-raw
التنسيق: {I420، YV12، YUY2، UYVY، AYUV، RGBx، BGRx، xRGB، xBGR، RGBA، BGRA، ARGB، ABGR، RGB، BGR، Y41B، Y42B، YVYU، Y444، v210، v216، NV12، NV21، NV16 و NV61 و NV24 و GRAY8 و GRAY16_BE و GRAY16_LE و v308 و RGB16 و BGR16 و RGB15 و BGR15 و UYVP و A420 و RGB8P و YUV9 و YVU9 و IYU1 و ARGB64 و AYUV64 و r210 و I420_1010 و I420_1010 و I420_1010 ، GBR ، GBR_10LE ، GBR_10BE ، NV12_64Z32 ، A420_10LE ، A420_10BE ، A422_10LE ، A422_10BE ، A444_10LE ، A444_10BE}
العرض: [1، 2147483647]
الارتفاع: [1 ، 2147483647]
فرامرات: [0/1 ، 2147483647/1]
image / jpeg
العرض: [1، 2147483647]
الارتفاع: [1 ، 2147483647]
فرامرات: [0/1 ، 2147483647/1]

أعلام العنصر:
لم يتم تعيين أعلام

أعلام بن:
لم يتم تعيين أعلام

تنفيذ العنصر:
لديه دالة change_state (): 0x7ff438f22ba0

العنصر ليس لديه قدرات قطع مسافة السباق.
لا يحتوي العنصر على إمكانات معالجة URI.

الوسادات:
Src: 'vfsrc'
Src: 'imgsrc'
SRC: "vidsrc"

خصائص العنصر:
name: اسم الكائن
أعلام: قراءة وكتابة
سلسلة الإفتراضي: "uvch264src0"
الأصل: أصل الكائن
أعلام: قراءة وكتابة
كائن من النوع "GstObject"
معالجة غير متزامنة: ستتعامل الحاوية مع تغييرات الحالة غير المتزامنة
أعلام: قراءة وكتابة
منطقي. الإفتراضي: خطأ
إعادة توجيه الرسالة: إعادة توجيه كافة رسائل الأطفال
أعلام: قراءة وكتابة
منطقي. الإفتراضي: خطأ
الوضع: وضع الالتقاط (التقاط الصور الثابتة أو تسجيل الفيديو)
أعلام: قراءة وكتابة
تعداد "GstCameraBin2Mode" افتراضي: 2، "mode-video"
(1): وضع صورة - التقاط صورة ثابتة (افتراضي)
(2): وضع الفيديو - تسجيل الفيديو
التكبير / التصغير: عامل التكبير الرقمي (على سبيل المثال 1.5 يعني 1.5x)
أعلام: قراءة وكتابة
تعويم. النطاق: 1 - 3.402823e + 38 الافتراضي: 1
max-zoom: عامل التكبير الرقمي (على سبيل المثال 1.5 يعني 1.5x)
الأعلام: مقروء
تعويم. النطاق: 1 - 3.402823e + 38 الافتراضي: 10
جاهز لالتقاط: يعلم هذا العنصر جاهز لبدء التقاط آخر
الأعلام: مقروء
منطقي. الإفتراضي: صحيح
المعاينات اللاحقة: في حالة نشر صور معاينة الالتقاط في الحافلة
أعلام: قراءة وكتابة
منطقي. الإفتراضي: صحيح
المعاينة: قبعات صورة المعاينة التي سيتم نشرها (NULL تعني أي)
أعلام: قراءة وكتابة
اي

معاينة عامل التصفية: عامل تصفية معاينة مخصص لمعالجة بيانات صورة المعاينة
أعلام: قراءة وكتابة
كائن من النوع "GstElement"
البدء التلقائي: يبدأ الالتقاط تلقائيًا عند الانتقال إلى حالة الإيقاف المؤقت
أعلام: قراءة وكتابة
منطقي. الإفتراضي: خطأ
اسم مساحة الألوان: اسم عنصر مساحة الألوان
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة
سلسلة الإفتراضي: "videoconvert"
jpeg-decoder-name: اسم عنصر وحدة فك ترميز jpeg
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة
سلسلة الإفتراضي: "jpegdec"
num-clock -amples: عدد عينات الساعة التي يتم تجميعها لمزامنة PTS (-1 = غير محدود)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة أو موقوفة مؤقتًا أو تشغيل
عدد صحيح النطاق: 0 - 2147483647 الافتراضي: 0
عدد المخازن المؤقتة: عدد المخازن المؤقتة المطلوب إخراجها قبل إرسال EOS (-1 = غير محدود)
أعلام: قراءة وكتابة
عدد صحيح النطاق: -1 - 2147483647 الافتراضي: -1
الجهاز: موقع الجهاز
أعلام: قراءة وكتابة
سلسلة الإفتراضي: "/ dev / video0"
اسم الجهاز: اسم الجهاز
الأعلام: مقروء
سلسلة الافتراضي: ""
معدل البت الأولي: معدل البت الأولي بت / ثانية (تحكم ثابت)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة
عدد صحيح بدون إشارة. النطاق: 0 - 4294967295 الافتراضي: 3،000،000
وحدات الشرائح: وحدات الشرائح (تحكم ثابت)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة
عدد صحيح بدون إشارة. النطاق: 0 - 65535 الافتراضي: 4
وضع الشريحة: يحدد وحدة خاصية وحدات الشرائح (التحكم الثابت)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة
التعداد "UvcH264SliceMode" الافتراضي: 3 ، "شريحة / إطار"
(0): تم تجاهلها - تم تجاهلها
(1): بت / شريحة - بت لكل شريحة
(2): ميجابايت / شريحة - ميجابايت لكل شريحة
(3): شريحة / إطار - شريحة لكل إطار
فترة iframe: الوقت بين إطارات IDR بالمللي ثانية (التحكم الثابت)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة
عدد صحيح بدون إشارة. النطاق: 0 - 65535 الافتراضي: 10000
نوع الاستخدام: نوع الاستخدام (تحكم ثابت)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة
التعداد "UvcH264UsageType" افتراضي: 1، "realtime"
(1): الوقت الفعلي - الوقت الفعلي (مؤتمرات الفيديو)
(2): البث - البث
(3): التخزين - التخزين
(4): ucconfig0 - UCConfig 0
(5): ucconfig1 - UCConfig 1
(6): ucconfig2q - UCConfig 2Q
(7): ucconfig2s - UCConfig 2S
(8): ucconfig3 - UCConfig 3
الانتروبيا: الانتروبيا (التحكم الثابت)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة
Enum "UvcH264Entropy" افتراضي: 0، "cavlc"
(0): cavlc - CAVLC
(1): كاباك - كاباك
enable-sei: تمكين توقيت صورة SEI (التحكم الثابت)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة
منطقي. الإفتراضي: خطأ
num-reorder-frames: عدد الإطارات B بين الإطارات المرجعية (التحكم الثابت)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة
عدد صحيح بدون إشارة. النطاق: 0 - 255 الافتراضي: 0
المعاينة المعكوسة: صورة مقلوبة أفقية لتدفقات غير H.264 (تحكم ثابت)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة
منطقي. الإفتراضي: خطأ
حجم دلو متسرب: حجم دلو متسرب بالمللي ثانية (تحكم ثابت)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة
عدد صحيح بدون إشارة. النطاق: 0 - 65535 الافتراضي: 1000
التحكم في المعدل: وضع التحكم في المعدل (التحكم الثابت والديناميكي)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة أو موقوفة مؤقتًا أو تشغيل
التعداد "UvcH264RateControl" الافتراضي: 1 ، "cbr"
(1): cbr - معدل بت ثابت
(2): vbr - معدل البت المتغير
(3): qp - QP الثابت
إطارات ثابتة: إطارات ثابتة (تحكم ثابت وديناميكي)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة أو موقوفة مؤقتًا أو تشغيل
منطقي. الإفتراضي: خطأ
max-mbps: عدد كتل الماكرو في الثانية لأقصى معدل معالجة
الأعلام: مقروء
عدد صحيح بدون إشارة. النطاق: 0 - 4294967295 الافتراضي: 0
level-idc: مستوى IDC (تحكم ديناميكي)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة أو موقوفة مؤقتًا أو تشغيل
عدد صحيح بدون إشارة. النطاق: 0 - 255 الافتراضي: 40
معدل البت الذروة: معدل البت الذروة بالبتات / الثانية (تحكم ديناميكي)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة أو موقوفة مؤقتًا أو تشغيل
عدد صحيح بدون إشارة. النطاق: 0 - 4294967295 الافتراضي: 3،000،000
معدل البت المتوسط: متوسط ​​معدل البت بالبت / الثانية (تحكم ديناميكي)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة أو موقوفة مؤقتًا أو تشغيل
عدد صحيح بدون إشارة. النطاق: 0 - 4294967295 الافتراضي: 3،000،000
min-iframe-qp: الحد الأدنى لحجم خطوة التكمية للإطارات I (تحكم ديناميكي)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة أو موقوفة مؤقتًا أو تشغيل
عدد صحيح النطاق: -127 - 127 الافتراضي: 10
max-iframe-qp: الحد الأدنى لحجم خطوة التكمية للإطارات I (التحكم الديناميكي)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة أو موقوفة مؤقتًا أو تشغيل
عدد صحيح النطاق: -127 - 127 الافتراضي: 46
min-pframe-qp: الحد الأدنى لحجم خطوة التكمية للإطارات P (التحكم الديناميكي)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة أو موقوفة مؤقتًا أو تشغيل
عدد صحيح النطاق: -127 - 127 الافتراضي: 10
max-pframe-qp: الحد الأدنى لحجم خطوة التكمية للإطارات P (التحكم الديناميكي)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة أو موقوفة مؤقتًا أو تشغيل
عدد صحيح النطاق: -127 - 127 الافتراضي: 46
min-bframe-qp: الحد الأدنى لحجم خطوة التكمية للإطارات B (التحكم الديناميكي)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة أو موقوفة مؤقتًا أو تشغيل
عدد صحيح النطاق: -127 - 127 الافتراضي: 10
max-bframe-qp: الحد الأدنى لحجم خطوة التكمية للإطارات B (التحكم الديناميكي)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة أو موقوفة مؤقتًا أو تشغيل
عدد صحيح النطاق: -127 - 127 الافتراضي: 46
ltr-buffer-size: إجمالي عدد الإطارات المرجعية طويلة المدى (تحكم ديناميكي)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة أو موقوفة مؤقتًا أو تشغيل
عدد صحيح النطاق: 0 - 255 الافتراضي: 0
التحكم في التشفير ltr: عدد إطارات LTR التي يمكن للجهاز التحكم فيها (التحكم الديناميكي)
أعلام: قراءة ، كتابة ، يمكن أن تكون فارغة أو جاهزة أو موقوفة مؤقتًا أو تشغيل
عدد صحيح النطاق: 0 - 255 الافتراضي: 0

إجراءات العنصر:
"Get-enum-setting": gboolean user_function (GstElement * object،
gchararray arg0 ،
gpointer arg1 ،
gpointer arg2) ؛
"Get-boolean-setting": gboolean user_function (GstElement * object،
gchararray arg0 ،
gpointer arg1 ،
gpointer arg2) ؛
"Get-int-setting": gboolean user_function (GstElement * object،
gchararray arg0 ،
gpointer arg1 ،
مؤشر gpointer arg2 ،
gpointer arg3) ؛
"بدء الالتقاط": v_x_function user_function (كائن GstElement *) ؛
"Stop-Capture": void user_function (GstElement * object) ؛

يمكن استخدام العديد من هذه المعلمات لتكوين المعلمات في ضغط H.264. أجد هذا مفاجئًا إلى حد ما نظرًا لأن الضغط يتم بواسطة الشريحة داخل الكاميرا. يعمل المثال التالي على زيادة معدل البيانات الافتراضي من 3 إلى 5 ميجابت في الثانية ويقلل الفاصل الزمني للإطار الرئيسي الافتراضي من 10 إلى 3 ثوانٍ:

 gst-launch-1.0 -v -e uvch264src initial-bitrate=5000000 average-bitrate=5000000 iframe-period=3000 device=/dev/video0 name=src auto-start=true src.vfsrc ! queue ! video/x-raw,format=YUY2,width=320,height=240,framerate=10/1 ! xvimagesink sync=false src.vidsrc ! queue ! video/x-h264,width=1280,height=720,framerate=30/1 ! h264parse ! avdec_h264 ! xvimagesink sync=false 

من ناحية أخرى ، لا توجد معلمات لضبط المعلمات المعتادة لكاميرا الويب ، مثل التباين والسطوع والتركيز وما إلى ذلك. لذلك ، ما زلنا بحاجة إلى أدوات خارجية لتكوينها ، مثل v4l2.ctl أو الخيار المذكور في القسم التالي.

v4l2src


يبدو أنه يمكننا أيضًا استخدام v4l2src القديم الجيد لالتقاط تدفقات H.264 المشفرة من Logitech C920:

 gst-launch-1.0 -v -e v4l2src device=/dev/video1 ! queue ! video/x-h264,width=1280,height=720,framerate=30/1 ! h264parse ! avdec_h264 ! xvimagesink sync=false 

هذا يرجع على الأرجح إلى تطور كل من gstreamer و V4L2. يبدو هذا الخيار أبسط إذا كنت لا تحتاج إلى تغيير إعدادات ضغط H.264 ، وهذا يتيح لنا الوصول إلى إعدادات الكاميرا مثل السطوع والتباين. لديها أيضًا ميزة كونها في حزمة مكون إضافي جيدة يمكن الاحتفاظ بها بشكل أفضل في المستقبل.

البث عبر الإنترنت عبر Gstreamer


على جهاز الاستقبال ، ابدأ جهاز الاستقبال:

 gst-launch-1.0 -v udpsrc port=6666 ! application/x-rtp, encoding-name=H264 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! autovideosink 

على جهاز مزود بكاميرا ، نبدأ في نقل الفيديو المشفر بالأجهزة:

 gst-launch-1.0 uvch264src name=src auto-start=true src.vidsrc ! video/x-h264,width=160,height=120,framerate=30/1 ! h264parse ! rtph264pay ! udpsink host=192.168.1.196 port=6666 

شكر خاص لـ Amomum لمساعدتي في كتابة هذا الرمز.

ملخص تأخير بث الفيديو من خلال Gstreamer


حتى مع دقة 1920 * 1080 ، لم يتجاوز حمل المعالج على Beaglebone Blue 30٪ ، ولم يكن تأخير الفيديو يزيد عن 0.3 ثانية. نعم ، نظرًا لأن الفيديو في هذا الإصدار تم بثه عبر UDP ، عندما يتم فقد الحزم ، تنهار الصورة إلى الإطار الرئيسي التالي ، ولكن يمكننا تكوينها بحيث يتم إرسال الإطارات الرئيسية في كثير من الأحيان.

مهام ROS


يبقى الآن فقط لدفع الفيديو المستلم إلى ROS ، إذا كان بإمكان أي شخص المساعدة في ذلك ، اكتب بشكل شخصي.

Source: https://habr.com/ru/post/ar415567/


All Articles