µStreamer は、MJPEG ビデオを任意の V4L2 デバイスからネットにストリーミングするための軽量かつ非常に高速なサーバーです。すべての新しいブラウザは、mplayer、VLC などのほとんどのビデオ プレーヤーと同様に、このビデオ形式をネイティブ サポートしています。µStreamer は、可能な限り最高の解像度と FPS で VGA および HDMI スクリーンキャスト ハードウェア データをストリーミングするように設計された PiKVM プロジェクトの一部です。
µStreamer は、 input_uvc.so
プラグインとoutput_http.so
プラグインを備えた mjpg-streamer に非常に似ていますが、いくつかの大きな違いがあります。主なものは次のとおりです。
特徴 | μストリーマー | mjpg-ストリーマー |
---|---|---|
マルチスレッド JPEG エンコード | ✔ | ✘ |
ハードウェア画像エンコード ラズベリーパイで | ✔ | ✘ |
デバイスの動作 ストリーミング中に切断される | ✔ 黒い画面が表示されるNO SIGNAL ん再接続されるまで | ✘ ストリーミングを停止します1 |
DV タイミングのサポート - 解像度を変更する機能 ソース信号によるオンザフライ | ✔ | ☹ 部分的にはい1 |
ストリーミング時にフレームをスキップするオプション トラフィックを節約するためにHTTPによる静的画像 | ✔ 2 | ✘ |
UNIXドメインソケット経由のストリーミング | ✔ | ✘ |
Systemd ソケットのアクティベーション | ✔ | ✘ |
再コンパイルせずにログをデバッグします。 パフォーマンス統計ログ、 HTTPストリーミングパラメータへのアクセス | ✔ | ✘ |
ファイルを提供するオプション 内蔵HTTPサーバーを使用 | ✔ | ☹ 通常ファイルのみ |
ストリーム状態に関する通知 GPIO で libgpiod を使用する | ✔ | ✘ |
Webカメラコントロール(フォーカス、サーボ)へのアクセス HTTP経由で明るさなどの設定も可能 | ✘ | ✔ |
mjpg-streamer の API との互換性 | ✔ | :) |
脚注:
1
µStreamer のずっと前に、mjpg-streamer に DV タイミングのサポートを追加し、デバイスの切断時にハングアップしないようにするパッチを作成しました。残念ながら、このパッチは完璧にはほど遠いので、毎回機能するという保証はありません。mjpg-streamer のソース コードは非常に複雑で、その構造を理解するのが困難です。これを念頭に置き、将来的にはマルチスレッドと JPEG ハードウェア アクセラレーションが必要になることに加えて、レガシー コードをサポートするのではなく、独自のストリーム サーバーを最初から作成することにしました。
2
この機能により、HDMI ストリーミング時の送信トラフィックを数分の 1 に削減できますが、CPU 使用率が少し増加します。 HDMI は完全なデジタル インターフェイスであり、キャプチャされた各フレームはバイト単位で前のフレームと同一である可能性があるという考えです。同じ画像を 1 秒間に数回ネット上にストリーミングする必要はありません。 --drop-same-frames=20
オプションを有効にすると、µStreamer は一致するフレームをすべてドロップします (連続 20 個の制限付き)。新しいフレームはそれぞれ、最初に長さによって前のフレームと照合され、次にmemcmp()
が使用されます。
裏庭の Web カメラからライブ ストリーミングを行う予定で、それを制御する必要がある場合は、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
使用して GitHub からソースをダウンロードして解凍できます。 。
$ 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
ustreamer を起動する前に-e EDID=1
を追加して HDMI EDID を設定します。 -e EDID_HEX=xx
と一緒に使用して、カスタム EDID データを指定します。
Raspberry Pi v3 カメラの使用例 (Raspbian のlibcamera-tools
およびlibcamera-v4l2
(両方をインストール) にあるlibcamerify
が必要):
$ 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 Web カメラの設定と情報を管理するツールを提供します。スクリプトを使用して調整を行い、手動または 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 by Maxim Devaev [email protected]
このプログラムはフリー ソフトウェアです。Free Software Foundation が発行する GNU General Public License の条件 (ライセンスのバージョン 3、または (ユーザーの選択による) 以降のバージョン) に基づいて再配布したり、変更したりすることができます。
このプログラムは役立つことを期待して配布されていますが、いかなる保証もありません。商品性や特定目的への適合性についての暗黙の保証もありません。詳細については、GNU 一般公衆利用許諾書を参照してください。
このプログラムと一緒に GNU 一般公衆利用許諾書のコピーも受け取っているはずです。そうでない場合は、https://www.gnu.org/licenses/ を参照してください。