OKI AIエッジコンピューター「AE2100」に、IPカメラの映像を取り込もう

<font color="Red">※この記事は「AE2100 標準コンテナイメージ（OpenVINO無(Ubuntu版)）(ファイル名: AE2100_StdContainer_Ubuntu_202009.zip)」を対象としています。
</font>

# 要約
* この資料は、OKI AI エッジコンピューター「AE2100」向けの設定解説です。
* ffmpegを使用して、AE2100のUbuntuコンテナ上でIPカメラの映像ストリームを映像ファイルとして保存します。

# はじめに
最近では、映像から車両や人物などを認識することをはじめ、様々なAIを用いたアプリが開発されています。
この記事では、AIを用いたアプリに映像を取り込むための第一歩として、ffmpegを使用して、AE2100のUbuntuコンテナ上でIPカメラの映像ストリームを映像ファイルとして保存するまでを行います。

この記事では、下記の順番で説明します。

* 環境
* ffmpegダウンロード
* AE2100のコンテナ設定
* カメラ設定
* ffmpeg実行

# 環境
実行環境は次の図のような構成を前提とします。

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/920565/6d763247-17ea-2d1d-60fe-73bd9941a305.png)

Windows PCはLAN2のネットワークに接続し、カメラはLAN1のネットワークに接続してください。
Windows PCには事前にTeraTermをインストールしておいてください。
IPカメラはONVIFプロトコルに対応していれば他社製でも使用できますが、ここではHoneywell製IPカメラ HDZP252DI を使用します。
（適宜IPアドレスなどはご使用環境に合わせ読み替えてください。）

# ffmpegダウンロード
インターネットにつながっているPCで、ffmpeg 4.3.1をダウンロードします。
https://ffmpeg.org/download.html にて「32-bit and 64-bit for kernel 3.2.0 and above」をクリックしてページ移動します。

・FFmpeg( https://ffmpeg.org/ )WEBページのスクリーンショット
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/920565/f980d70b-f6df-ce96-0d44-29992d89127a.png)


下図のように「release: 4.3.1」と記載の場合は「ffmpeg-release-amd64-static.tar.xz」をクリックしてダウンロードします。
「release: 4.3.1」以外であれば「old releases」をクリックして過去のダウンロードページに移動し、「ffmpeg-4.3.1-amd64-static.tar.xz」をダウンロードしてください。

・FFmpeg( https://ffmpeg.org/ )WEBページのスクリーンショット
![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/920565/5b35bc61-c8a3-b6cb-c872-7e41e865878a.png)

# AE2100のコンテナ設定
ubuntuベースコンテナをビルドします。
「AE2100_StdContainer_Ubuntu_202009.zip」を展開したファイル「ae2100_base.tar.gz」を使用します。
docker buildコマンドを実行する際は、Dockerfile が存在するディレクトリで実行し、コマンド行最後の「 . 」が漏れないようにご注意ください。

```
# tar xvfz ae2100_base.tar.gz
ae2100_base/
…
(省略)
…
ae2100_base/Dockerfile

# cd ae2100_base
# docker build -t ubuntu:ae2100_base .
…
(省略)
…
Successfully built xxxxxxxxxxxx
Successfully tagged ubuntu:ae2100_base

# cd ../
```

ffmpegの実行に必要なファイルをAE2100に転送して解凍します。
事前にダウンロードしていたffmpeg 4.3.1のファイルを、AE2100の任意のディレクトリに転送します。
転送完了後に解凍コマンドを実行します。

```
# tar Jxvf ffmpeg-release-amd64-static.tar.xz
ffmpeg-4.3.1-amd64-static/
ffmpeg-4.3.1-amd64-static/GPLv3.txt
…
(省略)
```

ベースコンテナにffmpegを追加したイメージファイルを作成するため、Dockerfileを作成します。
Dockerfileには下記を記載します。

```
FROM ubuntu:ae2100_base
COPY ffmpeg-4.3.1-amd64-static/ /home/ffmpeg-4.3.1-amd64-static/
```

コンテナイメージファイルを作成します。
docker buildコマンドを実行する際は、Dockerfile が存在するディレクトリで実行し、コマンド行最後の「 . 」が漏れないようにご注意ください。

```
# docker build -t ubuntu:ae2100_ffmpeg .
```

ubuntuコンテナを生成、起動します。

```
# docker run -dit --name rtsp_test ubuntu:ae2100_ffmpeg /bin/bash
```

# カメラ設定
IPカメラに下記設定をしてから、カメラをLAN1に接続してください。

### IPアドレス
カメラのWEB-UI経由でログインして、「ネットワーク設定 > TCP/IP」にて設定してください。

|項目|設定内容|備考|
|:-:|:-:|:-:|
|モード|静的|DHCPの利用有無をボタンで選択|
|IPバージョン|IPv4||
|IPアドレス|192.168.1.120||
|サブネットマスク|255.255.255.0||

### 映像設定
カメラのWEB-UI経由でログインして、「カメラ設定 > ビデオ」のメインストリームにて設定してください。

|項目|設定内容|
|:-:|:-:|
|フォーマット化|H.264|
|スマートコーデック|オフ|
|解像度|1920*1080(1080P)|
|フレームレート(FPS)|30|
|ビットレートタイプ|VBR|
|品質|4|
|ビットレート|4096|
|Iフレーム間隔|60|
|SVC|1(off)|

# ffmpeg実行
動作中コンテナのTerminalに接続します。

```
# docker exec -it rtsp_test /bin/bash
```

ffmpegでカメラに接続します。
コマンド実行後30秒ほど経過したら、Ctr + Cでコマンド終了してください。

* カメラにTCPで接続する場合(-rtsp_transport tcp)

```
# /home/ffmpeg-4.3.1-amd64-static/ffmpeg -rtsp_transport tcp -i rtsp://user:password@192.168.1.120:554 output_honeywell.mp4
```

* カメラにUDPで接続する場合(-rtsp_transport udp)

```
# /home/ffmpeg-4.3.1-amd64-static/ffmpeg -rtsp_transport udp -i rtsp://user:password@192.168.1.120:554 output_honeywell.mp4
```

映像ストリームを受信していることが実行結果で確認できます。
また、output_honeywell.mp4ファイルにカメラの映像ストリームが保存されます。
例えば、以下のような結果がコンソールに表示されます。
以下の結果から、カメラ設定どおり解像度が1920x1080, フレームレートが30fpsであることが分かります。

```
Output #0, mp4, to 'output_honeywell.mp4':
  Metadata:
    title           : Media Server
    encoder         : Lavf58.28.101
    Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuvj420p(pc), 1920x1080 [SAR 1:1 DAR 16:9], q=-1--1, 30 fps, 15360 tbn, 30 tbc
    Metadata:
      encoder         : Lavc58.53.101 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
```

映像ファイルに対してffprobeを使用して、カメラの映像ストリームを正常な映像ファイルとして保存していることを確認します。
以下の結果から、カメラ設定どおり解像度が1920x1080, フレームレートが30fpsであることが分かります。

```
# /home/ffmpeg-4.3.1-amd64-static/ffprobe output_honeywell.mp4
...
(省略)
...
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output_honeywell.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    title           : Media Presentation
    encoder         : Lavf58.45.100
  Duration: 00:00:05.17, start: 0.000000, bitrate: 2994 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 2992 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
```

# まとめ
今回はAE2100のUbuntuコンテナ上でffmpegを使用し、IPカメラの映像ストリームを映像ファイルに保存しました。
ffmpegのオプションを変更すれば任意のアプリに映像を取り込むことができます。
ffmpegとみなさんの作成したアプリケーションを組み合わせて、カメラ映像を活用することもできますので、ぜひお試しください。