GStreamerでmac bookのカメラをKinesis Video Streamに流す
全体アーキテクチャ
全体像はこんな感じ。2段構え。
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のウェブカメラ画像が流れているはず。