🗳️

ラズパイでMJPEG-StreamerのDockerコンテナを起動する

2022/08/27に公開

ラズパイでストリーミング配信の仕組みをDockerでやりたい

ラズパイにMJPEG-Streamerをインストールすることが多いのですがセットアップが若干面倒だなと思っています。セットアップが楽になるかもとMJPEG-StreamerのDockerイメージを作ることにしました。忘れる前に作り方をここに残します。

環境

DockerイメージはWindows11で作成しました。

  • Windows
    • Windows11
    • ※Dockerインストール済
  • DockerHub
    • Windowsで作ったDockerイメージをアップロード(push)する
    • ラズパイはDockerHubからDockerイメージを取得(pull)する
  • ラズパイ
    • Raspberry Pi 3 Model B+
    • カメラモジュールを接続
    • ※ラズパイOSのセットアップ・カメラモジュールの認識は設定済とします

構築

1.ラズパイOSのDockerイメージを作る【作業場所 Widows11】

ベースとなるラズパイOSのイメージを作成します。以下の手順を使わせていただきました。(ありがたい)

https://zenn.dev/pinto0309/articles/2e6483a2452c8f

作成したイメージはこのようになりました。

PS C:\> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zgw426/raspios_lite_armhf 2022-04-04_bullseye 8ecf64bd11xf 17 hours ago 1.16GB

2.MJPEG-StreamerのDockerfileを作成【作業場所 Widows11】

さきほど作成したラズパイOSのイメージを使いMJPEG-StreamerのDockerfileを作成します。

PS C:\Users\usr\Docker> tree /f
フォルダー パスの一覧
ボリューム シリアル番号は 0000-0000 です
C:.
│  Dockerfile_raspios-2022-04-04
│
├─parts
│      input_raspicam.so
│
└─src
        start.sh
  • 各ファイルの説明
    • Dockerfile_raspios-2022-04-04
      • Dockerファイル
    • parts/input_raspicam.so
      • MJPEG-Streamerの部品
      • バイナリファイル
      • ※MJPEG-Streamerが動く環境から拝借した
    • src/start.sh
      • Dockerを実行すると実行されるシェルスクリプト
      • MJPEG-Streamerの実行コマンドを記載している
      • ※Dockerイメージの作成中は不要
      • ※Dockerコンテナ起動時に必要
Dockerfile_raspios-2022-04-04
FROM zgw426/raspios_lite_armhf:2022-04-04_bullseye

RUN apt update
RUN apt -y dist-upgrade
RUN apt -y install build-essential libjpeg9-dev imagemagick libv4l-dev cmake
RUN apt -y install git

WORKDIR "/"

RUN apt install -y build-essential libjpeg9-dev imagemagick libv4l-dev cmake
RUN apt install -y git
RUN git clone https://github.com/jacksonliam/mjpg-streamer.git

WORKDIR "/mjpg-streamer/mjpg-streamer-experimental"

RUN sed -i 's/add_subdirectory.*input_opencv/#add_subdirectory(plugins\/input_opencv/g' CMakeLists.txt

RUN make
RUN make install
COPY parts/input_raspicam.so /mjpg-streamer/mjpg-streamer-experimental/
COPY parts/input_raspicam.so /mjpg-streamer/

ENTRYPOINT ["/bin/bash", "/work/src/start.sh"]
start.sh
#!/bin/bash

/mjpg-streamer/mjpg-streamer-experimental/mjpg_streamer \
 -o "output_http.so -w /mjpg-streamer/mjpg-streamer-experimental/www" \
 -i "input_raspicam.so"

3.MJPEG-StreamerのDockerイメージの作成【作業場所 Widows11】

作成したDockerfileでDockerイメージを作成(build)します。

PS C:\Users\usr\Docker> docker build -f Dockerfile_raspios-2022-04-04 -t mjpg .
PS C:\Users\usr\Docker> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mjpg latest c045dd4e2933 2 minutes ago   1.98GB

4.MJPEG-StreamerDockerイメージのアップロード【作業場所 Widows11】

作成したDockerイメージをラズパイに持っていくためにDocker Hubにアップロード(push)します。

Docker Hubのタグ付けルールに従いタグを付けます。

docker tag 4e2933c045dd zgw426/raspios_mjpeg:2022-08-26

このようになりました。

PS C:\Users\usr\Docker> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zgw426/raspios_mjpeg 2022-08-26 4e2933c045dd 12 minutes ago 1.98GB

docker loginでログインしたあとにアップロード(push)します。

docker push zgw426/raspios_mjpeg:2022-08-26

5.ラズパイにDockerをインストールする【作業場所 ラズパイ】

ラズパイにDocklerをインストールします。インストール方法は ↓ こちらにあります。

https://qiita.com/suo-takefumi/items/0ebfbb24d94496037405

6.ラズパイからDockerイメージを取得する【作業場所 ラズパイ】

Docker HubからDockerイメージを取得(pull)します。

docker pull zgw426/raspios_mjpeg:2022-08-26

イメージが取得できました。

piuser@raspi:~/data $ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zgw426/raspios_mjpeg 2022-08-26 4e2933c045dd 11 hours ago   1.98GB

7.ラズパイでDockerイメージを実行する【作業場所 ラズパイ】

カレントディレクトリ配下が以下の構成になっていることを確認します。

piuser@raspi:~/data $ tree
.
└── src
    └── start.sh
1 directory, 1 file

Dockerイメージを起動するコマンドはこれです。

docker run -dit --rm --name mjpg --privileged -v /opt/vc:/opt/vc -v ${PWD}/src:/work/src -p 8080:8080 zgw426/raspios_mjpeg:2022-08-26

WARNINGがでますが、実行はできました。WARNINGの理由は最初に作ったラズパイOSのイメージが間違えていたことが原因のようです。

piuser@raspi:~/data $ docker run -dit --rm --name mjpg --privileged -v /opt/vc:/opt/vc -v ${PWD}/src:/work/src -p 8080:8080 zgw426/raspios_mjpeg:2022-08-26
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm/v7) and no specific platform was requested
e64fa126381355bf1b00000ceeaa1fed6d03b36b00000a0d62923eac0

以下のコマンドでNAMESmjpgのコンテナのSTATUSが『UP XX xxxx』であれば起動状態です。

piuser@raspi:~/data $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0000278ab00 zgw426/raspios_mjpeg:2022-08-26 "/bin/bash /work/src…" 18 seconds ago   Up 9 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp mjpg

ストリーミング配信できていることを確認します。

http://{{ラズパイIPアドレス}}:8080/でMJPEG-Streamerのサイトが開き、ラズパイ設置のカメラからの映像が表示されれば成功です。

8.(オプション)起動したDockerイメージを停止する【作業場所 ラズパイ】

ストリーミング配信を停止する場合は、以下のように起動したDockerコンテナを停止します。

piuser@raspi:~/data $ docker stop mjpg

補足

MJPEG-Streamerの実行コマンドはsrc/start.shにあります。パラメータを変えたい場合はここを修正しDockerコンテナを起動してください。

start.sh
#!/bin/bash

/mjpg-streamer/mjpg-streamer-experimental/mjpg_streamer \
 -o "output_http.so -w /mjpg-streamer/mjpg-streamer-experimental/www" \
 -i "input_raspicam.so"

ー---

以上です。

今後のエンハンスについて

今回は動くものを作るだけで精一杯でした。今後はDockerイメージサイズをできるだけ小さくするよう最適化に挑戦したいと思います。

Discussion