μStreamer هو خادم خفيف الوزن وسريع جدًا لدفق فيديو MJPEG من أي جهاز V4L2 إلى الشبكة. تتمتع جميع المتصفحات الجديدة بدعم أصلي لتنسيق الفيديو هذا، بالإضافة إلى معظم مشغلات الفيديو مثل mplayer وVLC وما إلى ذلك. μStreamer هو جزء من مشروع PiKVM المصمم لدفق بيانات أجهزة تسجيل الشاشة VGA وHDMI بأعلى دقة وإطار في الثانية ممكنة.
μStreamer يشبه إلى حد كبير mjpg-streamer مع المكونات الإضافية input_uvc.so
و output_http.so
، ومع ذلك، هناك بعض الاختلافات الرئيسية. أهمها هي:
ميزة | μ غاسل | mjpg-streamer |
---|---|---|
ترميز JPEG متعدد الخيوط | ✔ | ✘ |
ترميز صورة الأجهزة على راسبيري باي | ✔ | ✘ |
السلوك عند الجهاز يتم قطع الاتصال أثناء البث | ✔ تظهر شاشة سوداء مع NO SIGNAL على ذلكحتى إعادة الاتصال | ✘ إيقاف البث 1 |
دعم توقيت DV - القدرة على تغيير القرار على الطاير عن طريق إشارة المصدر | ✔ | ☹ نعم جزئيًا 1 |
خيار تخطي الإطارات عند البث صور ثابتة بواسطة HTTP لحفظ حركة المرور | ✔ 2 | ✘ |
البث عبر مقبس مجال UNIX | ✔ | ✘ |
تفعيل مأخذ توصيل Systemd | ✔ | ✘ |
سجلات التصحيح دون إعادة الترجمة، سجل إحصائيات الأداء, الوصول إلى معلمات تدفق HTTP | ✔ | ✘ |
خيار لخدمة الملفات مع خادم HTTP المدمج | ✔ | ☹ الملفات العادية فقط |
إشارات حول حالة الدفق على GPIO باستخدام libgpiod | ✔ | ✘ |
الوصول إلى عناصر التحكم في كاميرا الويب (التركيز، الماكينات) والإعدادات مثل السطوع عبر HTTP | ✘ | ✔ |
التوافق مع واجهة برمجة التطبيقات الخاصة بـ mjpg-streamer | ✔ | :) |
الحواشي:
1
قبل فترة طويلة من استخدام μStreamer، قمت بعمل تصحيح لإضافة دعم توقيتات DV إلى mjpg-streamer ولمنع توقفه عند انقطاع اتصال الجهاز. للأسف، التصحيح أبعد ما يكون عن الكمال ولا أستطيع أن أضمن أنه سيعمل في كل مرة - كود مصدر mjpg-streamer معقد للغاية ومن الصعب فهم بنيته. مع أخذ هذا في الاعتبار، إلى جانب الحاجة إلى تسريع أجهزة تعدد العمليات وJPEG في المستقبل، قررت إنشاء خادم البث الخاص بي من البداية بدلاً من دعم التعليمات البرمجية القديمة.
2
تسمح هذه الميزة بتقليل حركة المرور الصادرة عدة أضعاف عند بث HDMI، ولكنها تزيد من استخدام وحدة المعالجة المركزية قليلاً. الفكرة هي أن HDMI عبارة عن واجهة رقمية بالكامل ويمكن أن يكون كل إطار تم التقاطه مطابقًا للإطار السابق من حيث البايت. ليست هناك حاجة لبث نفس الصورة عبر الشبكة عدة مرات في الثانية. مع تمكين الخيار --drop-same-frames=20
، سيقوم μStreamer بإسقاط جميع الإطارات المطابقة (بحد أقصى 20 على التوالي). تتم مطابقة كل إطار جديد مع الإطار السابق أولاً من حيث الطول، ثم باستخدام memcmp()
.
إذا كنت ستبث بثًا مباشرًا من كاميرا الويب الموجودة في الفناء الخلفي لديك وتحتاج إلى التحكم فيها، فاستخدم mjpg-streamer. إذا كنت تريد صورة عالية الجودة مع معدل إطارات عالي في الثانية - μStreamer لتحقيق الفوز.
أنت بحاجة إلى تنزيل μStreamer على نظامك وإنشائه من المصادر.
ستحتاج إلى make
و gcc
و libevent
مع دعم pthreads
و libjpeg9
/ libjpeg-turbo
و libbsd
(لنظام التشغيل Linux فقط).
sudo pacman -S libevent libjpeg-turbo libutil-linux libbsd
.sudo apt install libevent-dev libjpeg62-turbo libbsd-dev
. أضف libgpiod-dev
لـ WITH_GPIO=1
و libsystemd-dev
لـ WITH_SYSTEMD=1
و libasound2-dev libspeex-dev libspeexdsp-dev libopus-dev
لـ WITH_JANUS=1
.libjpeg62-turbo
بـ libjpeg62-turbo-dev
.sudo apt install build-essential libevent-dev libjpeg-dev libbsd-dev
.sudo apk add libevent-dev libbsd-dev libjpeg-turbo-dev musl-dev
. البناء باستخدام WITH_PTHREAD_NP=0
. لتمكين دعم GPIO، قم بتثبيت libgpiod وتمرير الخيار WITH_GPIO=1
. إذا أبلغ المترجم عن وظيفة مفقودة pthread_get_name_np()
(أو ما شابه ذلك)، أضف الخيار WITH_PTHREAD_NP=0
(يتم تمكينه افتراضيًا). بالنسبة للخطأ المماثل في setproctitle()
أضف خيار WITH_SETPROCTITLE=0
.
العملية الأكثر ملائمة هي استنساخ مستودع μStreamer Git على نظامك. إذا لم يكن Git مثبتًا لديك ولا تريد تثبيته أيضًا، فيمكنك تنزيل المصادر وفك ضغطها من GitHub باستخدام wget https://github.com/pikvm/ustreamer/archive/refs/heads/master.zip
.
$ git clone --depth=1 https://github.com/pikvm/ustreamer
$ cd ustreamer
$ make
$ ./ustreamer --help
بافتراض أن لديك نسخة μStreamer كما تمت مناقشته أعلاه، يمكنك تحديث μStreamer على النحو التالي.
$ cd ustreamer
$ git pull
$ make clean
$ make
بالنسبة لترميز أجهزة M2M على Raspberry Pi، تحتاج إلى 5.15.32 kernel على الأقل. تم إهمال وإزالة دعم OpenMAX وMMAL على النوى الأقدم.
بدون وسيطات، سيحاول ustreamer
فتح /dev/video0
بدقة 640x480 وبدء البث على http://127.0.0.1:8080
. يمكنك تجاوز هذا السلوك باستخدام المعلمات --device
و --host
و --port
. على سبيل المثال، للبث إلى العالم، قم بتشغيل:
# ./ustreamer --device=/dev/video1 --host=0.0.0.0 --port=80
❗ يرجى ملاحظة أنه نظرًا لأنه تم تعطيل الطلبات عبر النطاقات لـ μStreamer v2.0 افتراضيًا لأسباب أمنية. لتمكين السلوك القديم، استخدم الخيار --allow-origin=*
.
الطريقة الموصى بها لتشغيل μStreamer باستخدام جهاز التقاط يستند إلى TC358743 على Raspberry Pi:
$ ./ustreamer
--format=uyvy # Device input format
--encoder=m2m-image # Hardware encoding on V4L2 M2M driver
--workers=3 # Workers number
--persistent # Suppress repetitive signal source errors (for example when HDMI cable was disconnected)
--dv-timings # Use DV-timings
--drop-same-frames=30 # Save the traffic
❗ يرجى ملاحظة أنه لاستخدام --drop-same-frames
لمتصفحات مختلفة، يجب عليك استخدام بعض معلمات URL /stream
المحددة (راجع URL /
للحصول على التفاصيل).
يمكنك دائمًا عرض القائمة الكاملة للخيارات باستخدام ustreamer --help
.
أضف الأسطر التالية إلى /boot/firmware/usercfg.txt:
gpu_mem=128
dtoverlay=tc358743
التحقق من حجم CMA:
$ dmesg | grep cma-reserved
[ 0.000000] Memory: 7700524K/8244224K available (11772K kernel code, 1278K rwdata, 4320K rodata, 4096K init, 1077K bss, 281556K reserved, 262144K cma-reserved)
إذا كان حجمه أصغر من 128 ميجا، أضف ما يلي إلى /boot/firmware/cmdline.txt:
cma=128M
احفظ التغييرات وأعد التشغيل.
بداية الحاوية:
$ docker run --device /dev/video0:/dev/video0 -e EDID=1 -p 8080:8080 pikvm/ustreamer:latest
ثم قم بالوصول إلى واجهة الويب على المنفذ 8080 (على سبيل المثال http://raspberrypi.local:8080).
$ docker run --rm pikvm/ustreamer:latest
--format=uyvy
--workers=3
--persistent
--dv-timings
--drop-same-frames=30
أضف -e EDID=1
لضبط HDMI EDID قبل بدء تشغيل ustreamer. استخدمه مع -e EDID_HEX=xx
لتحديد بيانات EDID المخصصة.
مثال لاستخدام كاميرا Raspberry Pi v3 (مطلوب libcamerify
الموجود في libcamera-tools
و libcamera-v4l2
(تثبيت كليهما) على Raspbian):
$ sudo modprobe bcm2835-v4l2
$ libcamerify ./ustreamer --host :: --encoder=m2m-image
بالنسبة للكاميرا v2، يمكنك استخدام نفس الخدعة مع libcamerify
ولكن قم بتمكين وضع الكاميرا القديم في raspi-config
.
مثال للاستخدام لكاميرا Raspberry Pi v1:
$ sudo modprobe bcm2835-v4l2
$ ./ustreamer --host :: -m jpeg --device-timeout=5 --buffers=3 -r 2592x1944
❗ يرجى ملاحظة أن موديلات الكاميرات الأحدث تتمتع بدقة قصوى مختلفة. يمكنك رؤية الدقة المدعومة في وثائق PiCamera.
❗ إذا حصلت على معدل إطارات ضعيف، فمن الممكن أن تكون الكاميرا قد تحولت إلى وضع الصورة، مما ينتج عنه معدل إطارات منخفض (لكن صورة ذات جودة أعلى). وذلك لأن bcm2835-v4l2
يتحول إلى وضع الصورة بدقة أعلى من 1280x720
. للتغلب على هذه المشكلة، قم بتمرير معلمات الوحدة max_video_width
و max_video_height
كما يلي:
$ modprobe bcm2835-v4l2 max_video_width=2592 max_video_height=1944
يدعم μStreamer البث الموفر للنطاق الترددي باستخدام ضغط H.264 وخادم Janus WebRTC. راجع دليل تكامل Janus للحصول على التفاصيل الكاملة.
عندما يكون uStreamer خلف وكيل Nginx، فإن سلوك التخزين المؤقت الخاص به يقدم زمن الوصول إلى دفق الفيديو. من الممكن تعطيل التخزين المؤقت لـ Nginx للتخلص من زمن الوصول الإضافي:
location /stream {
postpone_output 0;
proxy_buffering off ;
proxy_ignore_headers X-Accel-Buffering;
proxy_pass http://ustreamer;
}
توفر الأدوات المساعدة v4l2 الأدوات اللازمة لإدارة إعدادات ومعلومات كاميرا الويب USB. يمكن استخدام البرامج النصية لإجراء التعديلات وتشغيلها يدويًا أو باستخدام cron. التشغيل في cron على سبيل المثال لتغيير إعدادات التعريض في أوقات معينة من اليوم. الحزمة متاحة في جميع توزيعات Linux وعادة ما تسمى v4l-utils
.
v4l2-ctl --list-devices
.v4l2-ctl -d /dev/video0 --list-ctrls
.v4l2-ctl -d /dev/video0 --list-formats-ext
.v4l2-ctl -d /dev/video0 --get-ctrl=exposure_auto
.v4l2-ctl -d /dev/video0 --set-ctrl=exposure_auto=1
. هنا يمكنك العثور على المزيد من الأمثلة. الوثائق متاحة في man v4l2-ctl
.
حقوق الطبع والنشر (C) 2018-2024 بواسطة مكسيم ديفاييف [email protected]
هذا البرنامج هو برنامج مجاني: يمكنك إعادة توزيعه و/أو تعديله بموجب شروط رخصة جنو العامة كما نشرتها مؤسسة البرمجيات الحرة، إما الإصدار 3 من الترخيص، أو (حسب اختيارك) أي إصدار لاحق.
يتم توزيع هذا البرنامج على أمل أن يكون مفيدًا، ولكن دون أي ضمان؛ دون حتى الضمان الضمني لقابلية التسويق أو الملاءمة لغرض معين. راجع رخصة جنو العامة لمزيد من التفاصيل.
ينبغي أن تكون قد حصلت على نسخة من رخصة جنو العامة مع هذا البرنامج. إذا لم يكن الأمر كذلك، راجع https://www.gnu.org/licenses/.