ブログ

Armadillo-IoT G4/X2:RTSPサーバとして画像を配信する

at_takuma.fukuda
2023年3月7日 21時04分

Armadillo-IoT G4/X2をRTSPサーバとして画像を配信することが出来ます。
今回の記事ではUSBカメラから入力した画像をエンコードしてそのまま配信し、USBカメラをWebカメラ化させていますが、
Armadillo-IoT G4/X2内部で画像処理を行い、その結果をエンコードして配信する事なども可能です。

コンテナイメージ読み込み

VPUの機能を使用するため、アットマークテクノが提供するイメージを使ってコンテナを作成します。
まずは下記手順を参考にコンテナイメージを読み込んでください。
9.2.3. アットマークテクノが提供するイメージを使う

confファイル作成

コンテナを作成するためのconfファイルを作成します。
/dev/video2として認識されるUSBカメラを接続している想定です。

[armadillo:~]# vi /etc/atmark/containers/rtsp_example.conf
set_image at-debian-image
set_command sleep infinity
add_device /dev/video2
add_ports 8554:8554
add_devices /dev/dri /dev/galcore
add_devices /dev/mxc_hantro /dev/mxc_hantro_vc8000e
add_devices /dev/ion
add_devices /dev/input /dev/tty7
add_volumes /run/udev:/run/udev:ro
add_volumes /opt/firmware:/opt/firmware:ro
add_args --cap-add=SYS_TTY_CONFIG
add_volumes /tmp/xdg_home:/run/xdg_home
add_args --env=XDG_RUNTIME_DIR=/run/xdg_home

コンテナ作成

confファイルからコンテナを作成し、コンテナ内で必要なパッケージやアプリケーションのインストールを行います。

[armadillo:~]# podman_start rtsp_example
コンテナの中に入る
[armadillo:~]# podman exec -it rtsp_example /bin/sh
必要なパッケージのインストール
[container:~]# apt update
[container:~]# apt upgrade
[container:~]# apt install -y gstreamer1.0-imx gstreamer1.0-imx-tools \
gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-bad \
git autoconf automake autopoint libtool pkg-config gtk-doc-tools \
libglib2.0-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-base1.0-dev build-essential v4l-utils
gst-rtsp-serverのダウンロード、ビルド
[container:~]# git clone git://anongit.freedesktop.org/gstreamer/gst-rtsp-server
[container:~]# cd gst-rtsp-server
[container:~]# git checkout 1.4
[container:~]# ./autogen.sh
[container:~]# make
USBカメラのパラメータ確認
対応している解像度やフレームレートを確認します。
以下は640×480 30fpsに対応している場合のものになりますので、適宜実際のカメラの値に合わせて変更してください。
[container:~]# v4l2-ctl -d /dev/video2 --all
RTSPサーバー実行ファイルの作成
viをインストールしていないのでechoコマンドでファイルを作成します。
[container:~]# echo "/gst-rtsp-server/examples/test-launch '( v4l2src device=/dev/video2 ! video/x-raw, width=640, height=480, framerate=30/1 ! queue ! vpuenc_h264 ! h264parse ! rtph264pay name=pay0 pt=96 )'" > /root/start_rtspserver.sh
[container:~]# chmod +x /root/start_rtspserver.sh
コンテナから出る
[container:~]# exit
[armadillo:~]# 

コンテナイメージ保存

コンテナに加えた変更を反映したイメージファイルを作成します。

[armadillo:~]# podman commit rtsp_example rtsp_example

confファイル修正

上記で保存したコンテナイメージを元に起動し、コンテナ起動時にRTSPサーバを立ち上げるようconfファイルを修正します。

[armadillo:~]# vi /etc/atmark/containers/rtsp_example.conf

set_image rtsp_example
#set_command sleep infinity
set_command /bin/sh /root/start_rtspserver.sh
add_device /dev/video2
add_ports 8554:8554
add_devices /dev/mxc_hantro /dev/mxc_hantro_vc8000e
add_devices /dev/ion
add_volumes /opt/firmware:/opt/firmware:ro
confファイル永続化
[armadillo:~]# persist_file /etc/atmark/containers/rtsp_example.conf

動作確認

Armadillo本体を再起動すると、起動時にrtsp_exampleコンテナが起動し、rtspサーバーとして動作します。
VLCメディアプレイヤーなどのクライアントソフトから以下のようにURLを指定してストリーミングを開くとUSBカメラから入力された画像が表示されます。

rtsp://[ArmadilloのIPアドレス]:8554/test

2023/4/17追記

USBカメラの画像フォーマットがMJPGの場合

USBカメラの画像フォーマットがMJPGの場合、一旦でコードを行う必要があります。そのため、gst-rtsp-serverのコマンドは以下のようになります。 フレームレートはMJPGのものとデコード後のものの2つを指定するようになっているので気を付けてください。

画面解像度1920×1080、フォーマットMJPG、フレームレート15fpsの場合
/gst-rtsp-server/examples/test-launch '( v4l2src device=/dev/video2 ! image/jpeg, width=1920, height=1080, framerate=15/1 ! jpegdec ! videorate ! video/x-raw,framerate=15/1 ! vpuenc_h264 ! h264parse ! rtph264pay name=pay0 pt=96 )'

解像度やフレームレートなどのデバッグ

解像度やフレームレートなどを色々変更して動作を確認したい場合、都度コンテナ内のファイルを変更してcommit→podman_startを繰り返すのは非常に手間と時間がかかるため、以下の方法を推奨します。

デバッグ準備

下記の通りrtsp_exampleを停止ます。

podman stop rtsp_example

別途デバッグ用のコンテナを作成します。まずデバッグ用のコンテナのconfファイルを作成します。

[armadillo:~]# vi /etc/atmark/containers/rtsp_debug.conf

set_image rtsp_example
set_command sleep infinity
add_device /dev/video2
add_ports 8554:8554
add_devices /dev/mxc_hantro /dev/mxc_hantro_vc8000e
add_devices /dev/ion
add_volumes /opt/firmware:/opt/firmware:ro
set_autostart no

念のためconfファイルを永続化しておきます。

[armadillo:~]# persist_file /etc/atmark/containers/rtsp_debug.conf

デバッグ用コンテナを起動させます。

[armadillo:~]# podman_start rtsp_debug

デバッグ

RTSPサーバ・USBカメラの設定変更や動作確認は、コマンドの実行のみで可能であるため、
コンテナの中には入らず、podman exec コマンドを使ってホストOS上から直接コマンドを実行して行います。

  • 1.USBカメラの使用可能な解像度などの確認
    [armadillo:~]# podman exec rtsp_debug v4l2-ctl --list-formats-ext -d /dev/video2
    

    下記のように結果が表示されます。

    ioctl: VIDIOC_ENUM_FMT
            Type: Video Capture
    
            [0]: 'YUYV' (YUYV 4:2:2)
                    Size: Discrete 640x480
                            Interval: Discrete 0.033s (30.000 fps)
                    Size: Discrete 352x288
                            Interval: Discrete 0.033s (30.000 fps)
                    Size: Discrete 320x240
                            Interval: Discrete 0.033s (30.000 fps)
                    Size: Discrete 176x144
                            Interval: Discrete 0.033s (30.000 fps)
                    Size: Discrete 160x120
                            Interval: Discrete 0.033s (30.000 fps)
                    Size: Discrete 1280x960
                            Interval: Discrete 0.133s (7.500 fps)
                    Size: Discrete 2048x1536
                            Interval: Discrete 0.286s (3.500 fps)
                    Size: Discrete 1920x1080
                            Interval: Discrete 0.286s (3.500 fps)
                    Size: Discrete 960x720
                            Interval: Discrete 0.067s (15.000 fps)
                    Size: Discrete 1600x1200
                            Interval: Discrete 0.200s (5.000 fps)
            [1]: 'MJPG' (Motion-JPEG, compressed)
                    Size: Discrete 640x480
                            Interval: Discrete 0.033s (30.000 fps)
                    Size: Discrete 352x288
                            Interval: Discrete 0.033s (30.000 fps)
                    Size: Discrete 320x240
                            Interval: Discrete 0.033s (30.000 fps)
                    Size: Discrete 176x144
                            Interval: Discrete 0.033s (30.000 fps)
                    Size: Discrete 160x120
                            Interval: Discrete 0.033s (30.000 fps)
                    Size: Discrete 1280x960
                            Interval: Discrete 0.067s (15.000 fps)
                    Size: Discrete 2048x1536
                            Interval: Discrete 0.067s (15.000 fps)
                    Size: Discrete 1920x1080
                            Interval: Discrete 0.067s (15.000 fps)
                    Size: Discrete 960x720
                            Interval: Discrete 0.033s (30.000 fps)
                    Size: Discrete 1600x1200
                            Interval: Discrete 0.067s (15.000 fps)
    
  • 2.USBカメラへの設定適用
    確認した内容に基づいて、USBカメラの解像度やフレームレートを設定します。

    解像度・画像フォーマット(1600×1200 MJPGに設定する場合)
    [armadillo:~]# podman exec rtsp_debug v4l2-ctl -d /dev/video2 -v width=1600,height=1200,pixelformat=MJPG
    フレームレート(15fpsに設定する場合)
    [armadillo:~]# podman exec rtsp_debug v4l2-ctl -d /dev/video2 -p 15
    
  • 3.動作確認
    変更した設定で動作を確認します。
    解像度1920×1080、フォーマットMJPG、フレームレート15fpsの場合
    [armadillo:~]# podman exec rtsp_debug /gst-rtsp-server/examples/test-launch '( v4l2src device=/dev/video2 ! image/jpeg, width=1920, height=1080, framerate=15/1 !jpegdec ! videorate ! video/x-raw,framerate=15/1 ! vpuenc_h264 ! h264parse ! rtph264pay name=pay0 pt=96 )'
    解像度640×480、フォーマットYUYV、フレームレート30fpsの場合
    [armadillo:~]# podman exec rtsp_debug /gst-rtsp-server/examples/test-launch '( v4l2src device=/dev/video2 ! video/x-raw, width=640, height=480, framerate=30/1 ! queue ! vpuenc_h264 ! h264parse ! rtph264pay name=pay0 pt=96 )'
    

    上記コマンド実行後、クライアントから画像が表示されるかを確認してください。
    画像表示されない場合は、入力内容に不備があるか設定内容が機器の仕様と合致していない可能性があります。
    1~3を再度試してください。

  • 4.アプリケーションコンテナへの適用
    デバッグ内容をコンテナイメージに反映し、アプリケーションコンテナで自動実行されるようにします。
    まずはデバッグコンテナのスクリプトを修正します。
    基本的には下記のように実行したいコマンドをechoコマンドでシェルスクリプトファイルへ出力させます。
    直接echoコマンドを実行するのではなく、/bin/sh -c "echo"とすることを留意して下さい。
    [armadillo:~]# podman exec rtsp_debug /bin/sh -c "echo \"3で実行したコマンドの「podman exec rtsp_debug」よりも後の部分\" > /root/start_rtspserver.sh"
    

    解像度640×480、フォーマットYUYV、フレームレート30fpsの場合は下記の通りです。

    [armadillo:~]# podman exec rtsp_debug /bin/sh -c "echo \"/gst-rtsp-server/examples/test-launch '( v4l2src device=/dev/video2 ! video/x-raw, width=640, height=480,framerate=30/1 ! queue ! vpuenc_h264 ! h264parse ! rtph264pay name=pay0 pt=96 )'\" > /root/start_rtspserver.sh"
    

    ファイルへの出力が正しくできているか念のため確認しておいてください。

    [armadillo:~]# podman exec rtsp_debug cat /root/start_rtspserver.sh
    /gst-rtsp-server/examples/test-launch '( v4l2src device=/dev/video2 ! video/x-raw, width=640, height=480,framerate=30/1 ! queue ! vpuenc_h264 ! h264parse ! rtph264pay name=pay0 pt=96 )'
    podman exec rtsp_debug /bin/sh -c "echo \"/gst-rtsp-server/examples/test-launch '( v4l2src device=/dev/video2 ! video/x-raw, width=640, height=480,framerate=30/1 ! queue ! vpuenc_h264 ! h264parse ! rtph264pay name=pay0 pt=96 )'\" > /root/start_rtspserver.sh"
    

    デバッグ用コンテナをコンテナイメージにcommitして反映してください。

    [armadillo:~]# podman commit rtsp_debug rtsp_example
    

    デバッグ用コンテナを停止してください。

    [armadillo:~]# podman stop rtsp_debug
    

    アプリケーションコンテナをpodman_startで起動してください

    [armadillo:~]# podman_start rtsp_example
    

    デバッグコンテナで変更した設定が適用された状態で動作しているはずです。クライアントから表示を確認してください。