人気記事

Kinesis RaspberryPi Udemy

ラズパイでAWS Kinesis Video StreamsのDockerを動かしてライブ映像を再生する

更新日:

ラズパイのライブ映像をAWS上で見れないものかと調べたところ、AWS上でライブ映像を見るサービスとしてはKinesis Video Streamsが該当するようでした。

次に、ラズパイからKinesis Video Streamsに出力する方法としてGstreamerを使った方法が多く出てきますが、ラズパイへの環境構築が大変そうな印象でした。

さらに調べたところ、なんとAWS公式サイトでKinesis Video Streams用の環境構築済のDockerがラズパイ用にも用意されていることが分かったので試したところ、若干つまずきながらも環境構築の手間を少なくライブ映像を取得できたので手順をまとめました。

事前準備

AWSマネジメントコンソールにIAMユーザでログインし、Amazon Kinesis Video Streamsへのアクセス権限を設定しておく必要があります。

AWS CLIで使用するアクセスキー、シークレットキーも控えておきます。

AWSは従量課金制で使い方によっては想定外の費用がかかってしまうため、事前にUdemyの【2022年版】これだけでOK! AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座 でAWSの全体像について学習することをオススメします。筆者もAWS関連の幾つかの講座を受講しましたが、本講座は丁寧なハンズオンがあり分かりやすかったです。

構成

手元にあったラズベリーパイ3BとPiカメラを使いました。

      • ラズベリーパイ 3B OS:Rasbian buster
      • Piカメラ OV5647  (以下を購入して使用しました)

    ラズパイにDockerをインストールする

    下記サイトを参考にインストールを実行

    https://qiita.com/yuyakato/items/1cdc7fa511f7767c95ac

pi@raspberrypi:~ $ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

(インストール実行)

pi@raspberrypi:~ $ docker version
Client: Docker Engine - Community
 Version:           20.10.12
 API version:       1.41
 Go version:        go1.16.12
 Git commit:        e91ed57
 Built:             Mon Dec 13 11:45:29 2021
 OS/Arch:           linux/arm
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.12
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.12
  Git commit:       459d0df
  Built:            Mon Dec 13 11:43:47 2021
  OS/Arch:          linux/arm
  Experimental:     false
 containerd:
  Version:          1.4.12
  GitCommit:        7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc:
  Version:          1.0.2
  GitCommit:        v1.0.2-0-g52b36a2
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

AWSからDockerイメージのダウンロード

公式サイトにラズベリーパイのDockerイメージのダウンロード方法が記載されています。

Dockerイメージをダウンロードする事前準備として、ラズパイにAWS CLIのインストールとアクセスキー等の設定を行い、Docker認証・ログインを行う必要があります。

ラズパイにAWS CLIをインストール

pi@raspberrypi:~ $ sudo pip3 install awscli --upgrade

pi@raspberrypi:~ $ aws --version
aws-cli/1.22.30 Python/3.7.2 Linux/5.10.17-v7+ botocore/1.23.30

aws configureでアクセスキー、シークレット、リージョン、フォーマットを設定

pi@raspberrypi:~ $ aws configure
AWS Access Key ID [None]: {YOUR_ACCESS_KEY_ID}
AWS Secret Access Key [None]: {YOUR_SECRET_ACCESS_KEY}
Default region name [None]: ap-northeast-1
Default output format [None]: json

Docker クライアントを認証、ログイン

まず、Dockerにログイン用のパスワードを取得するために以下のコマンドを入力します。

(私は最初、自分のAWSアカウント用のリージョンとAWS IDを入力すると思ってしまいましたが、そのまんま下記の通り入力すればよいです。)

pi@raspberrypi:~ $ aws ecr get-login --no-include-email --region us-west-2 --registry-ids 546150905175

入力すると、以下のような出力が生成されます。

docker login -u AWS -p eyJwYXlsb2FkIjoic3JHQ2JKcXZMNWdhdC9JVWlrNk9hdktmN0J6Umk5QXZTRHpMTUh1VWFMb2JNMVNETzVTZlN3cjhha3Fpc2ZiYmhuMDRwdzUzVy9hOVQ0eVRDYVJiTjhibUd6V0JhZnRZUmhWMlpSeUErOEo0VHJWTlE0aDV5R1FiakVnUkxuSG1VN25LN01Od1haRHJSc2VlTVgzd0RFSWhSSEowMFd6Rk9JY3A4SUp5UHc0MmMrQUpiWnhEWlpyOEkvNjZUTXo5cFg5MTlvUG5RcVh1cFR6eFBQL0FPaU5aYnBmT2RsU1JoeFB2NEQ0a3dNcjFORW03K1F0Z3ppQUlFcWRTZWUvc2xXcGlNSTJmK29KSWo3UDlPMEV3dDJ0OG1KTTJZdU5zRnpyOVI4T29HMFFGREVIeDdmTVdLWGpKa29ncXRPbnZna2NrbzA0eTB5cDZXd3BmbytORmFCNGluUVBGSHMxUHJoK1N4b1Y4MWNPbkFQWHBtbjY0WE5iSi9EeEZIZ29sbFdrVWdyZnBaR0VHYkRSWGF4ZDZMTWxyVjl3YU5jL1djc2NKU1JWWFM0S2VVeXRYa0ZzSnJrNmJadmdVWEFCR0syNW84Rm1LS212RDJzcTRoNGxrWlN4M3hJYkk3eU5mQ3Q4T2J0YmdISktEVURzT0dlWUdFeDlFWXZvRmNkUUF4UVU3SS9uODBzMHdWWVFtak1JaENOQy9OQmFLdUVUT1V0eFJNNWdTTEFBbmR2Vkw1WkJ6d1p3ci9WMEE3VVVjSWFkTHRoRkd3b1VrZjJjVkZpc1VEMHBhUnZjVEZxYmlKY3RaYWlKdXIvT3JUbmczdnlHTDhFbDZ5N0pETmZkbzk3V2pGZnVIbGY5NUo2a2NYeFJ6VlRxZWhFeTM5eUVxMlQvdmk3VXY3SEViSTJjL3pkL1VjY0ZnNFN1OCs1NldBdWd6VGlXMU92SDFEZk9GSDZySzFzWWRRS1dITDhxZWQyQmZkSWNWZWp4eUtQcXFrM1Z5eHUzdjR2L25HRzhHa2IzR1ZmZ29iM3JrRW9OdDZ3NXFEVmsxSWRiWmxXZ3V3b2RsSy85STIvUTc5cWNwWXpUOThNK1N1bzRQUkpobjZobzljeFIzTUFGTWVmZnVKK2NHc1Z6emJtYU93d0tHWFBmN25Sdzh0MmZlM2I5OGs0VmVMQkVzYUNnNGdOa01mUWpQTjJLYnRNVG10bTFFUVpKcFM5akZmZmVsZDg5cHlpVHFRamRuenVWbXNKMGhpTmVsVy9jZlFYL25VMUZTb3BRRHpVYTVmOTd6dmJaRlNpU2s1OGpYajlnNFFISmJJY3VWaTFwQXJJalR2ajFVSmQwVnZUMzVKc2xoTml3UWhncGphajJ1RUExeXNXVk5zdHRudzJ3WlpjNXh1UFJ5RFYwU0h4QXphUVdTTmtJdGRyT0l4QVIrV1hsa24wSlAwWWJQU0EwTEY2NjRmM2FzMVE9PSIsImRhdGFrZXkiOiJBUUVCQUhqNmxjNFhJSncvN2xuMEhjMDBETWVrNkdFeEhDYlk0UklwVE1DSTU4SW5Vd0FBQUg0d2ZBWUpLb1pJaHZjTkFRY0dvRzh3YlFJQkFEQm9CZ2txaGtpRzl3MEJCd0V3SGdZSllJWklBV1VEQkFFdU1CRUVER05mVzRISlpreTZGSDFkK0FJQkVJQTdCVEtjRDk2c1ZVRGVJUTl0c3JJNWJPbU56RFRNUVYzeW82ZHU2OEdJdkxGajNhUEdHRHpOdDZXR0UwblEwSEJlK1hwUlE3SE1ndHRmT2xBPSIsInZlcnNpb24iOiIyIiwidHlwZSI6IkRBVEFfS0VZIiwiZXhwaXJhdGlvbiI6MTY0MTY1NDg2MH0= https://546150905175.dkr.ecr.us-west-2.amazonaws.com

生成された出力をそのままコマンドとして入力し、Login SucceededとなればDockerへのログインが成功しています。

pi@raspberrypi:~ $ docker login -u AWS -p eyJwYXlsb2FkIjoic3JHQ2JKcXZMNWdhdC9JVWlrNk9hdktmN0J6Umk5QXZTRHpMTUh1VWFMb2JNMVNETzVTZlN3cjhha3Fpc2ZiYmhuMDRwdzUzVy9hOVQ0eVRDYVJiTjhibUd6V0JhZnRZUmhWMlpSeUErOEo0VHJWTlE0aDV5R1FiakVnUkxuSG1VN25LN01Od1haRHJSc2VlTVgzd0RFSWhSSEowMFd6Rk9JY3A4SUp5UHc0MmMrQUpiWnhEWlpyOEkvNjZUTXo5cFg5MTlvUG5RcVh1cFR6eFBQL0FPaU5aYnBmT2RsU1JoeFB2NEQ0a3dNcjFORW03K1F0Z3ppQUlFcWRTZWUvc2xXcGlNSTJmK29KSWo3UDlPMEV3dDJ0OG1KTTJZdU5zRnpyOVI4T29HMFFGREVIeDdmTVdLWGpKa29ncXRPbnZna2NrbzA0eTB5cDZXd3BmbytORmFCNGluUVBGSHMxUHJoK1N4b1Y4MWNPbkFQWHBtbjY0WE5iSi9EeEZIZ29sbFdrVWdyZnBaR0VHYkRSWGF4ZDZMTWxyVjl3YU5jL1djc2NKU1JWWFM0S2VVeXRYa0ZzSnJrNmJadmdVWEFCR0syNW84Rm1LS212RDJzcTRoNGxrWlN4M3hJYkk3eU5mQ3Q4T2J0YmdISktEVURzT0dlWUdFeDlFWXZvRmNkUUF4UVU3SS9uODBzMHdWWVFtak1JaENOQy9OQmFLdUVUT1V0eFJNNWdTTEFBbmR2Vkw1WkJ6d1p3ci9WMEE3VVVjSWFkTHRoRkd3b1VrZjJjVkZpc1VEMHBhUnZjVEZxYmlKY3RaYWlKdXIvT3JUbmczdnlHTDhFbDZ5N0pETmZkbzk3V2pGZnVIbGY5NUo2a2NYeFJ6VlRxZWhFeTM5eUVxMlQvdmk3VXY3SEViSTJjL3pkL1VjY0ZnNFN1OCs1NldBdWd6VGlXMU92SDFEZk9GSDZySzFzWWRRS1dITDhxZWQyQmZkSWNWZWp4eUtQcXFrM1Z5eHUzdjR2L25HRzhHa2IzR1ZmZ29iM3JrRW9OdDZ3NXFEVmsxSWRiWmxXZ3V3b2RsSy85STIvUTc5cWNwWXpUOThNK1N1bzRQUkpobjZobzljeFIzTUFGTWVmZnVKK2NHc1Z6emJtYU93d0tHWFBmN25Sdzh0MmZlM2I5OGs0VmVMQkVzYUNnNGdOa01mUWpQTjJLYnRNVG10bTFFUVpKcFM5akZmZmVsZDg5cHlpVHFRamRuenVWbXNKMGhpTmVsVy9jZlFYL25VMUZTb3BRRHpVYTVmOTd6dmJaRlNpU2s1OGpYajlnNFFISmJJY3VWaTFwQXJJalR2ajFVSmQwVnZUMzVKc2xoTml3UWhncGphajJ1RUExeXNXVk5zdHRudzJ3WlpjNXh1UFJ5RFYwU0h4QXphUVdTTmtJdGRyT0l4QVIrV1hsa24wSlAwWWJQU0EwTEY2NjRmM2FzMVE9PSIsImRhdGFrZXkiOiJBUUVCQUhqNmxjNFhJSncvN2xuMEhjMDBETWVrNkdFeEhDYlk0UklwVE1DSTU4SW5Vd0FBQUg0d2ZBWUpLb1pJaHZjTkFRY0dvRzh3YlFJQkFEQm9CZ2txaGtpRzl3MEJCd0V3SGdZSllJWklBV1VEQkFFdU1CRUVER05mVzRISlpreTZGSDFkK0FJQkVJQTdCVEtjRDk2c1ZVRGVJUTl0c3JJNWJPbU56RFRNUVYzeW82ZHU2OEdJdkxGajNhUEdHRHpOdDZXR0UwblEwSEJlK1hwUlE3SE1ndHRmT2xBPSIsInZlcnNpb24iOiIyIiwidHlwZSI6IkRBVEFfS0VZIiwiZXhwaXJhdGlvbiI6MTY0MTY1NDg2MH0= https://546150905175.dkr.ecr.us-west-2.amazonaws.com
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /home/pi/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

Raspberry Pi の Docker イメージのダウンロード

ログインできたので、Kinesis Video Streamsのラズパイ用のDockerイメージをdocker pullコマンドを使ってラズパイにダウンロードします。

pi@raspberrypi:~ $ docker pull 546150905175.dkr.ecr.us-west-2.amazonaws.com/kinesis-video-producer-sdk-cpp-raspberry-pi:latest

以下のメッセージが出力されます。環境によると思いますが筆者の環境ではダウンロード完了までに10分ほどかかりました。

latest: Pulling from kinesis-video-producer-sdk-cpp-raspberry-pi
6f33b9839210: Pull complete 
1f83cd570e23: Pull complete 
dc8ef852f5cc: Pull complete 
903513b16da7: Pull complete 
0fd77122af23: Pull complete 
edbcef6b3ca5: Pull complete 
d72ddf4f3171: Pull complete 
a00edc72ae21: Pull complete 
23af1748a6a3: Pull complete 
427d7cfd0065: Pull complete 
0c88655d0f57: Pull complete 
d2b18340315d: Pull complete 
6b9eb53e05df: Pull complete 
c948557de9f6: Pull complete 
12e9b4f4b511: Pull complete 
10bc044c77b0: Pull complete 
dc1db817aa50: Pull complete 
Digest: sha256:25501a67767565369a61e155e0e9c770253749c6f58a6c62eafc156d24b8479b
Status: Downloaded newer image for 546150905175.dkr.ecr.us-west-2.amazonaws.com/kinesis-video-producer-sdk-cpp-raspberry-pi:latest
546150905175.dkr.ecr.us-west-2.amazonaws.com/kinesis-video-producer-sdk-cpp-raspberry-pi:latest

ダウンロードしたDockerは$docker imagesコマンドで確認できます。

pi@raspberrypi:~ $ docker images
REPOSITORY                                                                                 TAG       IMAGE ID       CREATED         SIZE
546150905175.dkr.ecr.us-west-2.amazonaws.com/kinesis-video-producer-sdk-cpp-raspberry-pi   latest    cc035a39c4ff   18 months ago   794MB

Raspberry Pi の Docker起動

いよいよDockerを起動します。

sudo docker run -it --device=/dev/video0 --device=/dev/vchiq -v /opt/vc:/opt/vc 546150905175
.dkr.ecr.us-west-2.amazonaws.com/kinesis-video-producer-sdk-cpp-raspberry-pi /bin/bash

root@13d37188b62b:/opt/amazon-kinesis-video-streams-producer-sdk-cpp/build#

Docker内の環境変数の設定

起動したら、まず公式サイト通りに環境変数を設定します。

export LD_LIBRARY_PATH=/opt/awssdk/amazon-kinesis-video-streams-producer-sdk-cpp/kinesis-video-native-build/downloads/local/lib:$LD_LIBRARY_PATH
export PATH=/opt/awssdk/amazon-kinesis-video-streams-producer-sdk-cpp/kinesis-video-native-build/downloads/local/bin:$PATH
export GST_PLUGIN_PATH=/opt/awssdk/amazon-kinesis-video-streams-producer-sdk-cpp/kinesis-video-native-build/downloads/local/lib:$GST_PLUGIN_PATH

Docker内にAWS設定を反映

自分のAWSアカウント固有の情報もDocker上に反映しておきます。

export AWS_ACCESS_KEY_ID={YOUR_ACCESS_KEY_ID}
export AWS_SECRET_ACCESS_KEY={YOUR_SECRET_ACCESS_KEY}
export AWS_DEFAULT_REGION=ap-northeast-1

Kinesis Video Streamsへのビデオ出力を実行

肝心のKinesis Video Streamsへの出力方法について、公式サイトでは「デバイスに適した gst-launch-1.0 コマンドを使用してカメラからのストリーミングを開始します。」とだけの記載で戸惑ったのですが、こちらのサイトを参考に以下コマンドを実行しました。ストリーム名を「RASPI_STREAM」としています。

root@13d37188b62b:/opt/amazon-kinesis-video-streams-producer-sdk-cpp/build#  ./kvs_gstreamer_sample RASPI_STREAM -w 1280 -h 720 -f 5 -b 512

実行すると以下のようなメッセージが出力されます。

[INFO ] [08-01-2022 05:58:08:546.768 GMT] Using region: ap-northeast-1
[INFO ] [08-01-2022 05:58:08:547.305 GMT] Using aws credentials for Kinesis Video Streams
[INFO ] [08-01-2022 05:58:08:547.475 GMT] No session token was detected.
[INFO ] [08-01-2022 05:58:08:556.850 GMT] createKinesisVideoClient(): Creating Kinesis Video Client
[INFO ] [08-01-2022 05:58:08:557.311 GMT] heapInitialize(): Initializing native heap with limit size 134217728, spill ratio 0% and flags 0x00000001
[INFO ] [08-01-2022 05:58:08:557.487 GMT] heapInitialize(): Creating AIV heap.
[INFO ] [08-01-2022 05:58:08:557.748 GMT] heapInitialize(): Heap is initialized OK
[DEBUG] [08-01-2022 05:58:08:557.995 GMT] stepStateMachine(): State Machine - Current state: 0x0000000000000001, Next state: 0x0000000000000002
[DEBUG] [08-01-2022 05:58:08:558.213 GMT] getSecurityTokenHandler invoked
[DEBUG] [08-01-2022 05:58:08:558.628 GMT] Refreshing credentials. Force refreshing: 0 Now time is: 1641621488558380923 Expiration: 0
[INFO ] [08-01-2022 05:58:08:558.840 GMT] New credentials expiration is 1641625088
[DEBUG] [08-01-2022 05:58:08:559.111 GMT] stepStateMachine(): State Machine - Current state: 0x0000000000000002, Next state: 0x0000000000000010
[INFO ] [08-01-2022 05:58:08:559.355 GMT] createDeviceResultEvent(): Create device result event.
[DEBUG] [08-01-2022 05:58:08:559.547 GMT] stepStateMachine(): State Machine - Current state: 0x0000000000000010, Next state: 0x0000000000000040
[DEBUG] [08-01-2022 05:58:08:559.759 GMT] clientReadyHandler invoked
[DEBUG] [08-01-2022 05:58:08:560.063 GMT] Client is ready
[INFO ] [08-01-2022 05:58:08:560.674 GMT] Creating Kinesis Video Stream RASPI_STREAM
[INFO ] [08-01-2022 05:58:08:561.039 GMT] createKinesisVideoStream(): Creating Kinesis Video Stream.

Kinesis Video Streams画面の確認

AWSマネジメントコンソールからKinesis Video Streamsにアクセスします。

先ほど指定した「RASPI_STREAM」を開きます。

メディア再生を行うと、筆者の環境では15秒ほど遅延してライブ映像が表示されました。

後処理:ラズパイのKinesis Video Streamsへの出力を停止する

Kinesis Video Streamsを出力したままだと、コストがかかり続けてしまうため、使用を完了したら処理を停止します。

ラズパイのDocker上でcontrol + C コマンドにて処理を停止させます。

[DEBUG] [08-01-2022 06:01:29:647.131 GMT] postReadCallback(): Pausing CURL read for upload handle: 0
[DEBUG] [08-01-2022 06:01:30:623.682 GMT] postReadCallback(): Wrote 65524 bytes to Kinesis Video. Upload stream handle: 0
[DEBUG] [08-01-2022 06:01:30:630.692 GMT] postReadCallback(): Wrote 45854 bytes to Kinesis Video. Upload stream handle: 0
[DEBUG] [08-01-2022 06:01:30:635.140 GMT] postReadCallback(): Pausing CURL read for upload handle: 0
^C
root@13d37188b62b:/opt/amazon-kinesis-video-streams-producer-sdk-cpp/build# 

まとめ

今回は、ラズパイのDockerからAWS Kinesis Video Streamsへライブ映像を出力しました。

Dockerを初めて使ってみましたが、環境構築の手間が少なく魅力的だと思いました。

ビデオを取得できるところまでできたので、今後はAmazon Rekognitionの機械学習を使った動画分析なども行ってみたいと思います。

参考

AWSは従量課金制となっており、使い方によっては想定外の費用がかかることがあります。今回の場合、ラズパイからKinesis Video Streamsを継続したままとすると費用が積み上がってしまいます。

AWSにどういったサービスが存在し、どのような操作により費用がかかるのかについての大枠を理解した上の使用が望ましいと思います。事前にUdemyの【2022年版】これだけでOK! AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座 などの講座を活用してAWSのサービスや費用体系について学習することをオススメします。

-Kinesis, RaspberryPi, Udemy
-, ,

Copyright© ITエンジニアへの転身 , 2022 All Rights Reserved Powered by STINGER.