ラズパイのライブ映像を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をインストールする
下記サイトを参考にインストールを実行
-
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のサービスや費用体系について学習することをオススメします。