µStreamer 是一款輕量且非常快速的伺服器,可將 MJPEG 視訊從任何 V4L2 裝置串流傳輸到網路。所有新瀏覽器以及大多數視訊播放器(例如mplayer、VLC 等)都原生支援此視訊格式。數據。
µStreamer 與帶有input_uvc.so
和output_http.so
插件的 mjpg-streamer 非常相似,但是,存在一些主要差異。關鍵是:
特徵 | µStreamer | mjpg-流光 |
---|---|---|
多線程 JPEG 編碼 | ✔ | ✘ |
硬體影像編碼 在樹莓派上 | ✔ | ✘ |
設備時的行為 串流時已斷開連接 | ✔ 顯示黑屏NO SIGNAL 直到重新連接 | ✘ 停止串流媒體1 |
DV 計時支援 - 改變解析度的能力 透過來源訊號即時運行 | ✔ | ☹ 部分是1 |
串流時跳過幀的選項 HTTP靜態圖片,節省流量 | ✔2 | ✘ |
透過 UNIX 域套接字進行串流傳輸 | ✔ | ✘ |
Systemd 套接字激活 | ✔ | ✘ |
調試日誌而無需重新編譯, 效能統計日誌, 存取 HTTP 流參數 | ✔ | ✘ |
提供文件的選項 內建 HTTP 伺服器 | ✔ | ☹ 僅常規文件 |
發出有關流狀態的訊號 使用 libgpiod 在 GPIO 上 | ✔ | ✘ |
存取網路攝影機控制(對焦、伺服系統) 以及透過 HTTP 進行亮度等設置 | ✘ | ✔ |
與 mjpg-streamer 的 API 的兼容性 | ✔ | :) |
註腳:
1
早在 µStreamer 之前,我就製作了一個補丁,為 mjpg-streamer 添加 DV-timings 支持,並防止它在設備斷開連接時掛起。唉,這個補丁遠非完美,我不能保證它每次都能工作 - mjpg-streamer 的源代碼非常複雜,其結構也很難理解。考慮到這一點,加上未來需要多執行緒和 JPEG 硬體加速,我決定從頭開始製作自己的串流伺服器,而不是支援遺留程式碼。
2
此功能可在傳輸 HDMI 時將傳出流量減少數倍,但會稍微增加 CPU 使用率。這個想法是 HDMI 是一個全數位接口,每個捕獲的幀都可以與前一個位元組相同。無需每秒透過網路多次傳輸相同影像。啟用--drop-same-frames=20
選項後,µStreamer 將刪除所有符合的訊框(連續最多 20 個)。每個新幀首先按長度與前一幀匹配,然後使用memcmp()
。
如果您要從後院網路攝影機進行直播並需要控制它,請使用 mjpg-streamer。如果您需要具有高 FPS 的高品質影像 - µStreamer 將為您帶來勝利。
您需要將 µStreamer 下載到您的系統上並從原始程式碼建置它。
您需要make
、 gcc
、具有pthreads
支援的libevent
、 libjpeg9
/ libjpeg-turbo
和libbsd
(僅適用於 Linux)。
sudo pacman -S libevent libjpeg-turbo libutil-linux libbsd
。sudo apt install libevent-dev libjpeg62-turbo libbsd-dev
。為WITH_GPIO=1
新增libgpiod-dev
,為WITH_SYSTEMD=1
加入libsystemd-dev
,為WITH_JANUS=1
新增libasound2-dev libspeex-dev libspeexdsp-dev libopus-dev
。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 並且也不想安裝它,您可以使用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
對於 Raspberry Pi 上的 M2M 硬體編碼,您至少需要 5.15.32 核心。舊核心上的 OpenMAX 和 MMAL 支援已被棄用並刪除。
如果沒有參數, ustreamer
將嘗試以 640x480 解析度開啟/dev/video0
並開始在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=*
。
在 Raspberry Pi 上使用基於 TC358743 的擷取裝置來執行 µStreamer 的建議方法:
$ ./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)
如果小於 128M,請在 /boot/firmware/cmdline.txt 中加入以下內容:
cma=128M
儲存變更並重新啟動。
啟動容器:
$ docker run --device /dev/video0:/dev/video0 -e EDID=1 -p 8080:8080 pikvm/ustreamer:latest
然後透過連接埠8080存取Web介面(例如http://raspberrypi.local:8080)。
$ docker run --rm pikvm/ustreamer:latest
--format=uyvy
--workers=3
--persistent
--dv-timings
--drop-same-frames=30
新增-e EDID=1
以在啟動 ustreamer 之前設定 HDMI EDID。與-e EDID_HEX=xx
一起使用指定自訂 EDID 資料。
Raspberry Pi v3 相機的範例用法(需要libcamerify
,它位於 Raspbian 上的libcamera-tools
和libcamera-v4l2
(兩者都安裝)中):
$ 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]
該程式是自由軟體:您可以根據自由軟體基金會發布的 GNU 通用公共授權(授權的第 3 版)或(由您選擇)任何更高版本的條款重新散佈和/或修改它。
分發此程序的目的是希望它有用,但不提供任何保證;甚至沒有適銷性或特定用途適用性的默示保證。有關更多詳細信息,請參閱 GNU 通用公共許可證。
您應該隨該程式一起收到 GNU 通用公共授權的副本。如果沒有,請參閱 https://www.gnu.org/licenses/。