使って学ぶAWS

AWSで色々やってみるブログ

GStreamerでmac bookのカメラをKinesis Video Streamに流す

全体アーキテクチャ

全体像はこんな感じ。2段構え。

  • MacBookのカメラから、Mac内のDockerコンテナに対してストリームを投げる
  • KVS SDKのコンテナからKVSに対してストリームを投げる

f:id:yohei_ok:20220107153054p:plain MacでKVSのSDKをbuildするのが面倒なのでDockerで済ます。 Cloud9を利用することもできるけど、カメラがないので、ローカルのMacで試すことにした。

手順

とりあえず、試したいAWSアカウントを用意しておく。

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

基本的な手順はここに従う。 ただし、ドキュメントのdocker loginのコマンドは古いので注意。下記のようなコマンドを叩けば良い。

aws ecr get-login-password --region us-west-2 | docker login -u AWS --password-stdin https://546150905175.dkr.ecr.us-west-2.amazonaws.com

sudo docker pull 546150905175.dkr.ecr.us-west-2.amazonaws.com/kinesis-video-producer-sdk-cpp-amazon-linux:latest

注意として、プロファイルのdefault regionをap-northeast-1にしていると、エラーが出るので、--regionオプションを忘れないこと。

コンテナ立ち上げ

普通にImageをRunしてあげれば良い。 IoTCoreを使って認証したい場合は、認証用の鍵などを入れたファイルをコンテナ内に用意する必要があるので、マウントするなり、ファイルをコピーするカスタムコンテナを用意する必要がある。今回は-vオプションで、ボリュームマウントをしておく。(その中にIoTCoreの証明書などを入れておく。)

sudo docker run -it -v <LOCAL_DIR>:<CONTAINER_DIR> --network="host" 546150905175.dkr.ecr.us-west-2.amazonaws.com/kinesis-video-producer-sdk-cpp-amazon-linux /bin/bash

Macローカル側でやること

すでにKVS SDKの動く状態のコンテナが立ち上がっているので、そこにめがけてカメラストリームを流し込む必要がある。

Gstreamerのインストール

Homebrewで一発。

brew install gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad

gst-launchの実行

下記のようなコマンドでgstreamerを叩く。 宛先はtcpserversinkで、127.0.0.1向け。

$ gst-launch-1.0 autovideosrc ! videoconvert ! video/x-raw,width=1280,height=720 ! vtenc_h264_hw allow-frame-reordering=FALSE realtime=TRUE max-keyframe-interval=45 bitrate=512 ! gdppay ! tcpserversink host=127.0.0.1

パイプラインを一時停止 (PAUSED) にしています...
Pipeline is live and does not need PREROLL ...
Pipeline is PREROLLED ...
パイプラインを再生中 (PLAYING) にしています...
New clock: GstSystemClock
Redistribute latency...
WARNING: from element /GstPipeline:pipeline0/GstTCPServerSink:tcpserversink0: Pipeline construction is invalid, please add queues.
追加のデバッグ情報:
../libs/gst/base/gstbasesink.c(1258): gst_base_sink_query_latency (): /GstPipeline:pipeline0/GstTCPServerSink:tcpserversink0:
Not enough buffering available for  the processing deadline of 0:00:00.020000000, add enough queues to buffer  0:00:00.020000000 additional data. Shortening processing latency to 0:00:00.000000000.
0:00:13.6 / 99:99:99.

Dockerコンテナ内でやること

gst-launchの実行

gst-launch-1.0 -v tcpclientsrc host=host.docker.internal ! gdpdepay ! video/x-h264, format=avc,alignment=au ! h264parse ! kvssink stream-name=<STREAM_NAME> iot-certificate=$KVS_IOT_CERTIFICATE aws-region=$KVS_AWS_DEFAULT_REGION

kvssinkで、streamの名前を指定している。
環境変数としてIoTのCertificateとリージョンを渡している。iot-certificateは、IoTCoreでの認証を行う場合の引数。実際の中身は、下記のようになっている。

export KVS_IOT_CERTIFICATE="iot-certificate,endpoint=<KVS_ENDPOINT>,cert-path=<IoT_CERT>,key-path=<IoT_KEY>,ca-path=<IoT_CA>,role-aliases=<IoT_ROLE_ALIAS>"

以上を実行して、マネジメントコンソールなどでKinesis Video Streamのメディア再生を確認すれば、Macのウェブカメラ画像が流れているはず。