Home assistant:玄関カメラ・ラズパイカメラ ストリーミング配信

Home Assistant・IoT

このページはRaspberry Pi 5やストリーミングの失敗方法です。メモで残しておきます。

gstreamerでストリーミング Raspi5未完

gstreamer インストール

ラズパイで居留守を極める - Qiita
CYBIRDエンジニア Advent Calendar 2日目担当の @march_f です。1日目は @ntrv さんによる「新規案件の設計について, 使用したサービスの紹介」でした。私は普段…
sudo apt install gstreamer1.0-tools
sudo apt install gstreamer1.0-plugins-good
sudo apt install gstreamer1.0-plugins-bad
sudo apt install gstreamer1.0-plugins-ugly
sudo apt install libglib2.0-dev
sudo apt install libgstreamer1.0-dev
sudo apt install libgstreamer-plugins-base1.0-dev
sudo apt install libgstreamer-plugins-bad1.0-dev
sudo apt install libcgroup-dev
sudo apt install gobject-introspection libgirepository1.0-dev

$ gst-launch-1.0 --version
gst-launch-1.0 version 1.22.0
GStreamer 1.22.0
https://tracker.debian.org/pkg/gstreamer1.0
dpkg -l | grep gstreamer
ii  gir1.2-gstreamer-1.0:arm64           1.22.0-2                                arm64        GObject introspection data for the GStreamer library
ii  gstreamer1.0-alsa:arm64              1.22.0-3+deb12u1                        arm64        GStreamer plugin for ALSA
ii  gstreamer1.0-libav:arm64             1.22.0-2                                arm64        ffmpeg plugin for GStreamer
ii  gstreamer1.0-plugins-bad:arm64       1.22.0-4+deb12u5                        arm64        GStreamer plugins from the "bad" set
ii  gstreamer1.0-plugins-base:arm64      1.22.0-3+deb12u1                        arm64        GStreamer plugins from the "base" set
ii  gstreamer1.0-plugins-good:arm64      1.22.0-5+rpt1+deb12u1                   arm64        GStreamer plugins from the "good" set
ii  gstreamer1.0-plugins-ugly:arm64      1.22.0-2+deb12u1                        arm64        GStreamer plugins from the "ugly" set
ii  gstreamer1.0-tools                   1.22.0-2                                arm64        Tools for use with GStreamer
ii  gstreamer1.0-x:arm64                 1.22.0-3+deb12u1                        arm64        GStreamer plugins for X11 and Pango
ii  libgstreamer-gl1.0-0:arm64           1.22.0-3+deb12u1                        arm64        GStreamer GL libraries
ii  libgstreamer-plugins-bad1.0-0:arm64  1.22.0-4+deb12u5                        arm64        GStreamer libraries from the "bad" set
ii  libgstreamer-plugins-base1.0-0:arm64 1.22.0-3+deb12u1                        arm64        GStreamer libraries from the "base" set
ii  libgstreamer-plugins-base1.0-dev     1.22.0-3+deb12u1                        arm64        GStreamer development files for libraries from the "base" set
ii  libgstreamer1.0-0:arm64              1.22.0-2                                arm64        Core GStreamer libraries and elements
ii  libgstreamer1.0-dev:arm64            1.22.0-2                                arm64        GStreamer core development files

$ v4l2-ctl --list-devices
pispbe (platform:1000880000.pisp_be):
        /dev/video20
        /dev/video21
        /dev/video22
        /dev/video23
        /dev/video24
        /dev/video25
        /dev/video26
        /dev/video27
        /dev/video28
        /dev/video29
        /dev/video30
        /dev/video31
        /dev/video32
        /dev/video33
        /dev/video34
        /dev/video35
        /dev/video36
        /dev/video37
        /dev/media1
        /dev/media2

rp1-cfe (platform:1f00128000.csi):
        /dev/video0
        /dev/video1
        /dev/video2
        /dev/video3
        /dev/video4
        /dev/video5
        /dev/video6
        /dev/video7
        /dev/media3

rpivid (platform:rpivid):
        /dev/video19
        /dev/media0

 $ v4l2-ctl -d /dev/video19 --list-formats
ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture Multiplanar

        [0]: 'NC12' (Y/CbCr 4:2:0 (128b cols))
        [1]: 'NC30' (10-bit Y/CbCr 4:2:0 (128b cols))

バージョンを合わせる必要がある。1.22.0だろうと思う。

Raspberry Pi(Bullseye 64bit)でGStreamerを使用したRTSPサーバー - Qiita
1. 概要以前、Raspberry Pi 3BにBusterをインストールした場合のRTSPサーバーを試した。今回はOSをBullseys 64bitに変更して同様に動作するか確認する。尚、ハー…

gst-rtsp-server インストール

インストールに必要なツールをインストール

sudo apt install meson ninja-build
wget https://gstreamer.freedesktop.org/src/gst-rtsp-server/gst-rtsp-server-1.22.0.tar.xz
tar -xf gst-rtsp-server-1.22.0.tar.xz
cd gst-rtsp-server-1.22.0
meson setup build/
ninja -C build/
cd build
sudo ninja install

動作確認

Raspberry Pi(Bullseye 64bit)でGStreamerを使用したRTSPサーバー - Qiita
1. 概要以前、Raspberry Pi 3BにBusterをインストールした場合のRTSPサーバーを試した。今回はOSをBullseys 64bitに変更して同様に動作するか確認する。尚、ハー…
cd examples 
./test-launch '( videotestsrc ! x264enc ! rtph264pay name=pay0 pt=96 )'

PCからRaspi5のIPアドレスでVLC「rtsp://192.168.31.53:8554/test」のようにアクセス

ここまでできたが、うまくストリーミングできなかった。

./test-launch '( v4l2src device=/dev/video19 ! video/x-h264,width=1280,height=720,framerate=10/1 ! h264parse ! rtph264pay name=pay0 pt=96 protocols=tcp )'

./test-launch '( v4l2src device=/dev/video19 ! image/jpeg,width=1280,height=720,framerate=10/1 ! jpegdec ! x264enc ! rtph264pay name=pay0 pt=96 protocols=tcp )'

VLCでアクセスするとエラーになる。
live555 error: Failed to connect with rtsp://192.168.31.53:8554/unicast
satip error: Failed to setup RTSP session

Webブラウザからストリーミング配信 失敗

ライブラリ インストール

sudo apt install libatlas-base-dev
sudo apt install libhdf5-dev
sudo apt install libqt5gui5 libqt5webkit5 libqt5test5 

Raspi5(Debian bookworm)ではlibjasper-devが無い?ようなので失敗

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 12 (bookworm)
Release:        12
Codename:       bookworm

Ubuntuでは↓このやりかたでlibjasper-devがインストールできるみたい。sudo apt-add-repository contrib non-free-firmwareすると最後のほうで「E: Failed to fetch http://security.ubuntu.com/ubuntu/dists/xenial-security/main/binary-armhf/Packages 404 Not Found [IP: 91.189.91.81 80]
E: Some index files failed to download. They have been ignored, or old ones used instead.」と出るので古いファイルは削除されているみたい。

sudo apt-add-repository contrib non-free-firmware
sudo apt update

sudo apt install libjasper1 libjasper-dev

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package libjasper1
E: Unable to locate package libjasper-dev

sources.list.dの中身を削除してリポジトリをもとに戻す
sudo rm /etc/apt/sources.list.d/*

mjpg_streamer ストリーミング

Raspi3Bや4Bではうまくいったmjpg_streamerですが、Raspi5ではmakeで失敗しました。未解決

どうやらRaspberry Pi 5は対応していないようです。

以下、古いRaspberry Pi 3・4の手順

カメラが認識されているか

 $ vcgencmd get_camera
supported=1 detected=1, libcamera interfaces=0

supported=1 detected=1が「0」だと認識されていない。

古いラズパイは↓以下を実行、カメラを接続して以下の設定をしてリブート。必要!

$ sudo raspi-config
5 Interfacing Options > P1 Camera はい
rebootする

mjpg_streamer インストール

sudo apt-get install cmake subversion libjpeg-dev imagemagick -y
git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental 
make
sudo make install

wwwを/home/go直下に置く

$ mv www ~

実行してみる

まだカメラ接続してない状態

$ mjpg_streamer -i "/usr/local/lib/mjpg-streamer/input_uvc.so -d /dev/video0 -y  -r 320x240 -f 15" -o "/usr/local/lib/mjpg-streamer/output_http.so -p 8080 -w ./www"
MJPG Streamer Version.: 2.0
 i: Using V4L2 device.: (null)
 i: Desired Resolution: 320 x 240
 i: Frames Per Second.: 15
 i: Format............: YUYV
 i: JPEG Quality......: 80
 i: TV-Norm...........: DEFAULT
 i: init_VideoIn failed

終了しない場合

[ctrl]+[c]を押してもなかなか終了しないので、別のコンソールからpkillする。

pkill mjpg_streamer

Jetson nano1280x720にする

$ v4l2-ctl --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Index       : 0
        Type        : Video Capture
        Pixel Format: 'RG10'
        Name        : 10-bit Bayer RGRG/GBGB
                Size: Discrete 3264x2464
                        Interval: Discrete 0.048s (21.000 fps)
                Size: Discrete 3264x1848
                        Interval: Discrete 0.036s (28.000 fps)
                Size: Discrete 1920x1080
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1640x1232
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1280x720
                        Interval: Discrete 0.017s (60.000 fps)
                Size: Discrete 1280x720
                        Interval: Discrete 0.017s (60.000 fps)
mjpg_streamer -i "/usr/local/lib/mjpg-streamer/input_uvc.so -d /dev/video0 -y -r 1280x720 -f 15" -o "/usr/local/lib/mjpg-streamer/output_http.so -p 8080 -w ./www"
MJPG Streamer Version.: 2.0
 i: Using V4L2 device.: /dev/video0
 i: Desired Resolution: 1280 x 720
 i: Frames Per Second.: 15
 i: Format............: YUYV
 i: JPEG Quality......: 80
 i: TV-Norm...........: DEFAULT
Opening in BLOCKING MODE
 i: The specified resolution is unavailable, using: width 3264 height 2464 instead
Unable to query that the FPS change is supported
: Inappropriate ioctl for device
 o: www-folder-path......: ./www/
 o: HTTP TCP port........: 8080
 o: HTTP Listen Address..: (null)
 o: username:password....: disabled
 o: commands.............: enabled

表示されるけど画像、真っ白、もしくは緑、HDMIでディスプレイ接続したらちゃんと映像表示されるのでカメラはこわれてない。

オプションが違う?

video0が無かった Raspi

video0が無かったので、video10にしてみる。video11,video12もダメ、

 $ mjpg_streamer -i "/usr/local/lib/mjpg-streamer/input_uvc.so -d /dev/video10 -y  -r 320x240 -f 15" -o "/usr/local/lib/mjpg-streamer/output_http.so -p 8080 -w ./www"
MJPG Streamer Version.: 2.0
 i: Using V4L2 device.: /dev/video10
 i: Desired Resolution: 320 x 240
 i: Frames Per Second.: 15
 i: Format............: YUYV
 i: JPEG Quality......: 80
 i: TV-Norm...........: DEFAULT
Error opening device /dev/video10: video capture not supported.
Init v4L2 failed !! exit fatal
 i: init_VideoIn failed

video0が無いので以下を追加する。

$ sudo mknod /dev/video0 c 81 0
$ sudo chmod 660 /dev/video0
$ sudo chown root.video /dev/video0

でもUSB電源外したりすると、video0がなくなる場合がある。

これでmjpg_streamer実行してもエラーになる???

$ v4l2-ctl -d /dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Index       : 0
        Type        : Video Capture Multiplanar
        Pixel Format: 'YU12'
        Name        : Planar YUV 4:2:0

        Index       : 1
        Type        : Video Capture Multiplanar
        Pixel Format: 'YV12'
        Name        : Planar YVU 4:2:0

        Index       : 2
        Type        : Video Capture Multiplanar
        Pixel Format: 'NV12'
        Name        : Y/CbCr 4:2:0

        Index       : 3
        Type        : Video Capture Multiplanar
        Pixel Format: 'NV21'
        Name        : Y/CrCb 4:2:0

        Index       : 4
        Type        : Video Capture Multiplanar
        Pixel Format: 'RGBP'
        Name        : 16-bit RGB 5-6-5

再起動して再び実行するとこうなった。

 $ mjpg_streamer -i "/usr/local/lib/mjpg-streamer/input_uvc.so -d /dev/video0 -y  -r 320x240 -f 15" -o "/usr/local/lib/mjpg-streamer/output_http.so -p 8080 -w ./www"
MJPG Streamer Version.: 2.0
 i: Using V4L2 device.: /dev/video0
 i: Desired Resolution: 320 x 240
 i: Frames Per Second.: 15
 i: Format............: YUYV
 i: JPEG Quality......: 80
 i: TV-Norm...........: DEFAULT
UVCIOC_CTRL_ADD - Error at Pan (relative): Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD - Error at Tilt (relative): Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD - Error at Pan Reset: Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD - Error at Tilt Reset: Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD - Error at Pan/tilt Reset: Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD - Error at Focus (absolute): Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Pan (relative): Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Tilt (relative): Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Pan Reset: Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Tilt Reset: Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Pan/tilt Reset: Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Focus (absolute): Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at LED1 Mode: Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at LED1 Frequency: Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Disable video processing: Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Raw bits per pixel: Inappropriate ioctl for device (25)
 o: www-folder-path......: ./www/
 o: HTTP TCP port........: 8080
 o: HTTP Listen Address..: (null)
 o: username:password....: disabled
 o: commands.............: enabled

http://192.168.31.204:8080/にアクセスするとファイルがない。/home/pi/wwwが無い状態。

404: Not Found!
Could not open file

trunk/mjpg-streamer-experimentalの中にあるwwwディレクトリを/home/pi/wwwに置く。実行すると以下のようになる。

 $ mjpg_streamer -i "/usr/local/lib/mjpg-streamer/input_uvc.so -d /dev/video0 -y  -r 320x240 -f 15" -o "/usr/local/lib/mjpg-streamer/output_http.so -p 8080 -w ./www"
MJPG Streamer Version.: 2.0
 i: Using V4L2 device.: /dev/video0
 i: Desired Resolution: 320 x 240
 i: Frames Per Second.: 15
 i: Format............: YUYV
 i: JPEG Quality......: 80
 i: TV-Norm...........: DEFAULT
UVCIOC_CTRL_ADD - Error at Pan (relative): Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD - Error at Tilt (relative): Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD - Error at Pan Reset: Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD - Error at Tilt Reset: Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD - Error at Pan/tilt Reset: Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD - Error at Focus (absolute): Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Pan (relative): Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Tilt (relative): Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Pan Reset: Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Tilt Reset: Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Pan/tilt Reset: Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Focus (absolute): Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at LED1 Mode: Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at LED1 Frequency: Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Disable video processing: Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Raw bits per pixel: Inappropriate ioctl for device (25)
 o: www-folder-path......: ./www/
 o: HTTP TCP port........: 8080
 o: HTTP Listen Address..: (null)
 o: username:password....: disabled
 o: commands.............: enabled

完成。

mjpg_streamer

SHファイル

$vim /home/pi/script/streamer.sh
#!/bin/sh

PORT="8080" #ポート番号
#ID="xxxx" #IDは好きなもの
#PW="xxxxxxxx" #パスワード
SIZE="640x480" #画面サイズ
FRAMERATE="20" #フレームレート
LOT="180" #回転
export LD_LIBRARY_PATH=/usr/local/lib
/usr/local/bin/mjpg_streamer \
	    -i "input_uvc.so -f $FRAMERATE -r $SIZE -rot $LOT -d /dev/video0 -y -n" \
	        -o "output_http.so -w /home/pi/www -p $PORT "
	        #-o "output_http.so -w /usr/local/www -p $PORT -c $ID:$PW"

正常に起動する。

 $ sh /home/pi/script/streamer.sh
MJPG Streamer Version.: 2.0
 i: Using V4L2 device.: /dev/video0
 i: Desired Resolution: 640 x 480
 i: Frames Per Second.: 20
 i: Format............: YUYV
 i: JPEG Quality......: 80
 i: TV-Norm...........: DEFAULT
 o: www-folder-path......: /home/pi/www/
 o: HTTP TCP port........: 8080
 o: HTTP Listen Address..: (null)
 o: username:password....: disabled
 o: commands.............: enabled

Cronで自動起動

$crontab -e

#以下を追加
@reboot /bin/sh /home/pi/script/streamer.sh

/dev/video0が消える

Raspi3Bで何故か/dev/video0が消えてしまう。

$ sudo v4l2-ctl --list-devices
bcm2835-codec (platform:bcm2835-codec):
        /dev/video10
        /dev/video11
        /dev/video12

Failed to open /dev/video0: No such file or directory

新しく作っても再起動で消える。

カメラのフラットケーブルが切れてる?ようだった。

カメラがちゃんと接続されていないと、/dev/video0が消えるみたい。

いや、ケーブルは折れてるけど違うカメラで普通に表示したので、カメラが壊れているみたい。

動くけどCPU90%消費!

-y をなくしたら軽くなった。けど動かない・・・-y=YUYVフォーマットを指定するか否か(MJPEGがウェブカメラでサポートされていない場合)

-y -nを削除するとCPU2%になった!

この記事は複数のページに別れています

コメント