μStreamer adalah server yang ringan dan sangat cepat untuk melakukan streaming video MJPEG dari perangkat V4L2 apa pun ke internet. Semua browser baru memiliki dukungan asli untuk format video ini, serta sebagian besar pemutar video seperti mplayer, VLC, dll. μStreamer adalah bagian dari proyek PiKVM yang dirancang untuk melakukan streaming data perangkat keras screencast VGA dan HDMI dengan resolusi dan FPS setinggi mungkin.
μStreamer sangat mirip dengan mjpg-streamer dengan plugin input_uvc.so
dan output_http.so
, namun ada beberapa perbedaan besar. Yang utama adalah:
Fitur | μStreamer | mjpg-streamer |
---|---|---|
Pengkodean JPEG multithread | ✔ | ✘ |
Pengkodean gambar perangkat keras pada Raspberry Pi | ✔ | ✘ |
Perilaku saat perangkat terputus saat streaming | ✔ Menampilkan layar hitamNO SIGNAL di atasnyasampai terhubung kembali | ✘ Menghentikan streaming 1 |
Dukungan pengaturan waktu DV - kemampuan untuk mengubah resolusi dengan cepat berdasarkan sinyal sumber | ✔ | ☹ Sebagian ya 1 |
Pilihan untuk melewati frame saat streaming gambar statis dengan HTTP untuk menghemat lalu lintas | ✔ 2 | ✘ |
Streaming melalui soket domain UNIX | ✔ | ✘ |
Aktivasi soket Systemd | ✔ | ✘ |
Debug log tanpa kompilasi ulang, log statistik kinerja, akses ke parameter streaming HTTP | ✔ | ✘ |
Pilihan untuk menyajikan file dengan server HTTP bawaan | ✔ | ☹ Hanya file biasa |
Memberi sinyal tentang status aliran di GPIO menggunakan libgpiod | ✔ | ✘ |
Akses ke kontrol webcam (fokus, servo) dan pengaturan seperti kecerahan melalui HTTP | ✘ | ✔ |
Kompatibilitas dengan API mjpg-streamer | ✔ | :) |
Catatan kaki:
1
Jauh sebelum μStreamer, saya membuat patch untuk menambahkan dukungan pengaturan waktu DV ke mjpg-streamer dan mencegahnya terhenti saat perangkat terputus. Sayangnya, tambalan ini jauh dari sempurna dan saya tidak dapat menjamin tambalan itu akan berfungsi setiap saat - kode sumber mjpg-streamer sangat rumit dan strukturnya sulit untuk dipahami. Dengan mengingat hal ini, seiring dengan kebutuhan akselerasi perangkat keras multithreading dan JPEG di masa depan, saya memutuskan untuk membuat server streaming sendiri dari awal alih-alih mendukung kode lama.
2
Fitur ini memungkinkan untuk mengurangi lalu lintas keluar beberapa kali lipat saat streaming HDMI, namun ini sedikit meningkatkan penggunaan CPU. Idenya adalah bahwa HDMI adalah antarmuka yang sepenuhnya digital dan setiap frame yang diambil dapat identik dengan frame sebelumnya. Tidak perlu melakukan streaming gambar yang sama melalui internet beberapa kali dalam satu detik. Dengan opsi --drop-same-frames=20
diaktifkan, µStreamer akan menghapus semua frame yang cocok (dengan batas 20 berturut-turut). Setiap frame baru dicocokkan dengan frame sebelumnya terlebih dahulu berdasarkan panjangnya, kemudian menggunakan memcmp()
.
Jika Anda akan melakukan streaming langsung dari webcam halaman belakang dan perlu mengontrolnya, gunakan mjpg-streamer. Jika Anda membutuhkan gambar berkualitas tinggi dengan FPS tinggi - µStreamer adalah solusinya.
Anda perlu mengunduh μStreamer ke sistem Anda dan membangunnya dari sumbernya.
Anda memerlukan make
, gcc
, libevent
dengan dukungan pthreads
, libjpeg9
/ libjpeg-turbo
dan libbsd
(hanya untuk Linux).
sudo pacman -S libevent libjpeg-turbo libutil-linux libbsd
.sudo apt install libevent-dev libjpeg62-turbo libbsd-dev
. Tambahkan libgpiod-dev
untuk WITH_GPIO=1
dan libsystemd-dev
untuk WITH_SYSTEMD=1
dan libasound2-dev libspeex-dev libspeexdsp-dev libopus-dev
untuk WITH_JANUS=1
.libjpeg62-turbo
menjadi 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
. Bangun dengan WITH_PTHREAD_NP=0
. Untuk mengaktifkan dukungan GPIO, instal libgpiod dan berikan opsi WITH_GPIO=1
. Jika kompiler melaporkan tentang fungsi yang hilang pthread_get_name_np()
(atau serupa), tambahkan opsi WITH_PTHREAD_NP=0
(diaktifkan secara default). Untuk kesalahan serupa dengan setproctitle()
tambahkan opsi WITH_SETPROCTITLE=0
.
Proses yang paling mudah adalah mengkloning repositori µStreamer Git ke sistem Anda. Jika Anda belum memasang Git dan juga tidak ingin memasangnya, Anda dapat mengunduh dan mengekstrak sumber dari GitHub menggunakan 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
Dengan asumsi Anda memiliki klon µStreamer seperti yang dibahas di atas, Anda dapat memperbarui µStreamer sebagai berikut.
$ cd ustreamer
$ git pull
$ make clean
$ make
Untuk pengkodean perangkat keras M2M pada Raspberry Pi, Anda memerlukan setidaknya kernel 5.15.32. Dukungan OpenMAX dan MMAL pada kernel lama tidak digunakan lagi dan dihapus.
Tanpa argumen, ustreamer
akan mencoba membuka /dev/video0
dengan resolusi 640x480 dan mulai streaming di http://127.0.0.1:8080
. Anda dapat mengganti perilaku ini menggunakan parameter --device
, --host
dan --port
. Misalnya, untuk melakukan streaming ke dunia, jalankan:
# ./ustreamer --device=/dev/video1 --host=0.0.0.0 --port=80
❗ Harap dicatat bahwa karena permintaan lintas domain µStreamer v2.0 dinonaktifkan secara default karena alasan keamanan. Untuk mengaktifkan perilaku lama, gunakan opsi --allow-origin=*
.
Cara yang disarankan untuk menjalankan μStreamer dengan perangkat capture berbasis TC358743 di 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
❗ Harap dicatat bahwa untuk menggunakan --drop-same-frames
pada browser yang berbeda, Anda perlu menggunakan beberapa parameter URL /stream
tertentu (lihat URL /
untuk detailnya).
Anda selalu dapat melihat daftar lengkap opsi dengan ustreamer --help
.
Tambahkan baris berikut ke /boot/firmware/usercfg.txt:
gpu_mem=128
dtoverlay=tc358743
Periksa ukuran 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)
Jika lebih kecil dari 128M tambahkan berikut ini ke /boot/firmware/cmdline.txt:
cma=128M
Simpan perubahan dan reboot.
Mulai wadah:
$ docker run --device /dev/video0:/dev/video0 -e EDID=1 -p 8080:8080 pikvm/ustreamer:latest
Kemudian akses antarmuka web di port 8080 (misal http://raspberrypi.local:8080).
$ docker run --rm pikvm/ustreamer:latest
--format=uyvy
--workers=3
--persistent
--dv-timings
--drop-same-frames=30
Tambahkan -e EDID=1
untuk mengatur HDMI EDID sebelum memulai ustreamer. Gunakan bersama dengan -e EDID_HEX=xx
untuk menentukan data EDID khusus.
Contoh penggunaan untuk kamera Raspberry Pi v3 (wajib libcamerify
yang terletak di libcamera-tools
dan libcamera-v4l2
(install keduanya) di Raspbian):
$ sudo modprobe bcm2835-v4l2
$ libcamerify ./ustreamer --host :: --encoder=m2m-image
Untuk kamera v2 Anda dapat menggunakan trik yang sama dengan libcamerify
tetapi mengaktifkan mode kamera lama di raspi-config
.
Contoh penggunaan untuk kamera Raspberry Pi v1:
$ sudo modprobe bcm2835-v4l2
$ ./ustreamer --host :: -m jpeg --device-timeout=5 --buffers=3 -r 2592x1944
❗ Harap diperhatikan bahwa model kamera yang lebih baru memiliki resolusi maksimum yang berbeda. Anda dapat melihat resolusi yang didukung di dokumentasi PiCamera.
❗ Jika Anda mendapatkan framerate yang buruk, mungkin kamera dialihkan ke mode foto, yang menghasilkan framerate rendah (tetapi kualitas gambar lebih tinggi). Ini karena bcm2835-v4l2
beralih ke mode foto pada resolusi lebih tinggi dari 1280x720
. Untuk mengatasinya, teruskan parameter modul max_video_width
dan max_video_height
seperti ini:
$ modprobe bcm2835-v4l2 max_video_width=2592 max_video_height=1944
μStreamer mendukung streaming hemat bandwidth menggunakan kompresi H.264 dan server Janus WebRTC. Lihat panduan integrasi Janus untuk detail selengkapnya.
Saat uStreamer berada di belakang proxy Nginx, perilaku bufferingnya menimbulkan latensi ke dalam aliran video. Buffer Nginx dapat dinonaktifkan untuk menghilangkan latensi tambahan:
location /stream {
postpone_output 0;
proxy_buffering off ;
proxy_ignore_headers X-Accel-Buffering;
proxy_pass http://ustreamer;
}
Utilitas v4l2 menyediakan alat untuk mengelola pengaturan dan informasi webcam USB. Skrip dapat digunakan untuk melakukan penyesuaian dan dijalankan secara manual atau dengan cron. Berjalan di cron misalnya untuk mengubah pengaturan eksposur pada waktu tertentu dalam sehari. Paket ini tersedia di semua distribusi Linux dan biasanya disebut 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
. Di sini Anda dapat menemukan lebih banyak contoh. Dokumentasi tersedia di man v4l2-ctl
.
Hak Cipta (C) 2018-2024 oleh Maxim Devaev [email protected]
Program ini adalah perangkat lunak bebas: Anda dapat mendistribusikan ulang dan/atau memodifikasinya berdasarkan ketentuan Lisensi Publik Umum GNU sebagaimana diterbitkan oleh Free Software Foundation, baik versi 3 dari Lisensi tersebut, atau (sesuai pilihan Anda) versi yang lebih baru.
Program ini disebarluaskan dengan harapan dapat bermanfaat, namun TANPA JAMINAN APA PUN; bahkan tanpa jaminan tersirat mengenai KELAYAKAN UNTUK DIPERDAGANGKAN atau KESESUAIAN UNTUK TUJUAN TERTENTU. Lihat Lisensi Publik Umum GNU untuk lebih jelasnya.
Anda seharusnya sudah menerima salinan Lisensi Publik Umum GNU bersama dengan program ini. Jika tidak, lihat https://www.gnu.org/licenses/.