COLUMN
【テックメモシリーズ】Amazon Chime SDKを使ったビデオミーティングの録画機能を試してみた
最近レジンアートに興味のある中村です。
NTT東日本が行ってきた さまざまな開発テクニックを紹介する「テックメモシリーズ」、開発者が実際の業務のなかで書き溜めていった作業メモをそのままリアルにご紹介するシリーズとなります。 |
今回は2022年夏にAmazon Chime SDKに新しく追加されたビデオミーティングの録画機能について構築手順の記録を交えて紹介いたします。
Amazon Chime SDKの録画機能の調査
Amazon Chime は、AWSが展開する、グループのビデオ・音声・チャットによるコミュニケーションを支援する統合ツールです。
Amazon Chimeは、Saasアプリと、アプリの開発基盤を提供するAmazon Chime SDKがあります。今回は、Amazon Chime SDKのビデオミーティングの録画機能について、ご紹介します。
https://aws.amazon.com/jp/chime/chime-sdk/
Chime SDKの録画機能のこれまで
当初、Amazon Chime SDKには録画機能はありませんでした。
録画を行う場合、ヘッドレスブラウザ等で録画専用の出席者をミーティングに出席させ、出席者が写っているブラウザの画面をキャプチャし、動画に変換して保存する手法が公開されています。
その後、録画できるメディアキャプチャ機能が追加され、出席者一人のビデオ映像や、合成された音声を録画できるようになりましたが、複数の参加者の映像を合成したい場合には、以前の方法で録画する必要がありました。
また、動画が分割出力されるので、動画を連結したい場合、手動で連結を行う必要がありました。
2022年夏に、メディアキャプチャ機能に
- 「複数人の出席者を選んで、まとめて1つの動画として録画する」合成機能
- 「時系列で分割された5秒毎の映像を一つの映像にする」連結機能
が追加され、APIで簡単に録画が出来るようになっています。
今回は、この追加機能について調査を行いました。
合成機能の調査
動画の合成機能を調査しました。
動画を合成のレイアウトを「出席者のみ」「コンテンツ共有と発信者のビデオ」「コンテンツ共有と4人の出席者のビデオ」から選ぶことができます。
レイアウトを決め、APIを実行することで、録画専用の出席者が自動で出席・録画を行う仕組みです。
今回は「コンテンツ共有と発信者のビデオ」を試してみました。
まず、chimeサービスがmediapipelineサービスを使えるように、サービスロールを設定します。
録画したアーティファクトを保存するS3バケットを定義します。
S3バケットにバケットポリシーを追加し、mediapipelineサービスからS3へのアクセス権限を付与します。
動画の連結機能も同じバケットで調査するため、GetObject,ListObjectのアクションも追加しています。
amazon chime sdk上で録画対象のビデオミーティングを作成し、ミーティングIDを入手します。
今回は社内のAmazon Chime の開発基盤を流用し、Google Chromeを使って、Amazon Chime Rect Component Library上でミーティングを開始します。
https://github.com/aws/amazon-chime-sdk-component-library-react
アプリケーション内で、useMeetingManagerを呼び出すことで最新のミーティング情報から、ミーティングIDを取得することができます。
サーバサイドでミーティングイベントをトリガーしても、同じIDを取得することができます。
https://docs.aws.amazon.com/ja_jp/chime-sdk/latest/dg/using-events.html
取得したミーティングIDを元に、パラメータが格納されたjsonを作成します。
input.jsonには、AWSアカウントIDと、ミーティングIDを設定します。
CompositedVideo項目を追加すると、出力レイアウトや、画質、表示する出席者のフィルタを行うことができます。
{
"SourceType": "ChimeSdkMeeting",
"SourceArn": "arn:aws:chime::xxxxxxxxxxxx:meeting:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"SinkType": xxxxxxxx",
"SinkArn": "xxxxxxxxxxxxxxxx",
"ChimeSdkMeetingConfiguration":
{
"ArtifactsConfiguration":
{
"Audio":
{
"MuxType": "AudioWithCompositedVideo"
},
"Video":
{
"State": "Disabled",
"MuxType": "VideoOnly"
},
"Content":
{
"State": "Disabled",
"MuxType": "ContentOnly"
},
"CompositedVideo":
{
"Layout": "GridView",
"Resolution": "FHD",
"GridViewConfiguration":
{
"ContentShareLayout": "PresenterOnly",
"PresenterOnlyConfiguration":
{
"PresenterPosition": "TopRight"
}
}
}
}
}
}
バージニアのCloudShellにjsonをアップロードし、create-media-capture-pipelineを実行しました。
aws chime-sdk-media-pipelines create-media-capture-pipeline --cli-input-json file://input.json
成功すると、MediaPipelineId、MediaPipelineArnが返却されます。
この2つは後ほど使用します。
Reactアプリケーション側に、録画用の出席者が入室し、録画が開始されたことが分かります。
プレゼンターのカメラ映像と、ブラウザのコンテンツ共有を合わせて配信しています。
これが合成されて録画されます。
aws-cliで、録画時に発行されたMediaPipelineIdを使用し、delete-media-capture-pipelineを実行するか、ミーティングを削除することで録画は終了します。
aws chime-sdk-media-pipelines delete-media-capture-pipeline --media-pipeline-id xxxxxxxxx
合成機能を使って録画を行った場合、input.jsonで指定したバケット配下に「composited-video」フォルダがあり、録画データが、5秒単位で保存されています。
5秒毎にS3にアップロードされるので、S3トリガを組み合わせると、Lambdaでのリアルタイムな解析に役立てることができます。
ダウンロードした動画を再生してみました。
カメラ映像、コンテンツの共有が合成されていることが分かります。
連結機能の調査
動画の連結機能を調査しました。
5秒毎にチャンクされた動画を1つの動画に連結したい場合、録画時に発行されたMediaPipelineArnを元に、パラメータが格納されたjsonを作成します。
{
"Sources": [
{
"Type": "MediaCapturePipeline",
"MediaCapturePipelineSourceConfiguration": {
"MediaPipelineArn": "arn:aws:chime:us-east-1:xxxxxxxxxxxx:media-pipeline/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"ChimeSdkMeetingConfiguration": {
"ArtifactsConfiguration": {
"Audio": {
"State": "Disabled"
},
"Video": {
"State": "Disabled"
},
"Content": {
"State": "Disabled"
},
"DataChannel": {
"State": "Disabled"
},
"TranscriptionMessages": {
"State": "Disabled"
},
"MeetingEvents": {
"State": "Disabled"
},
"CompositedVideo": {
"State": "Enabled"
}
}
}
}
}
],
"Sinks": [
{
"Type": xxxxxxxx",
xxxxxxxxSinkConfiguration": {
"Destination": "xxxxxxxxxxxxxxxx"
}
}
]
}
バージニアのCloudShellにjsonをアップロードし、create-media-concatration-pipelineを実行しました。
aws chime-sdk-media-pipelines create-media-concatenation-pipeline --cli-input-json file://merge-input.json
録画したコンテンツの長さに応じて、結合完了が完了するまで、少し時間が掛かります。
処理が終わると、バケット配下に、MediaPipelineIdと同じ名前のフォルダが作成され、連結された動画が出力されました。
まとめ
メディアキャプチャの新機能により、動画の合成・連結が簡単に行えることが解りました。
お客様へのサービスとして、往々にして録画してほしいというニーズは多く、大きな追加実装を行わなくても録画が実現できるというのは嬉しい機能です。
※ご紹介したメディアパイプラインの合成機能・連結機能は、通常の費用に加え、追加費用が発生します。
詳細は、Amazon Chime SDK の Media Pipelines料金項目をご確認下さい。
おわりに
今回は2022年夏にAmazon Chime SDKに新しく追加された「複数⼈の出席者を選んで、まとめて1つの動画として録画する」合成機能と「時系列で分割された5秒毎の映像を⼀つの映像にする」連結機能ついて実際に構築して動作させるまでの一連の操作記録をご紹介しました。
「Amazon Chimeを使ったことがない」「Amazon Chime SDKの追加機能をまだ試したことがない」といった方の参考になれば幸いです。
これからもNTT東日本が行ってきた さまざまな開発テクニックを紹介していきますのでご期待ください。
※Amazon Web Services(AWS)および記載するすべてのAmazonのサービス名は、米国その他の諸国における、Amazon.com, Inc.またはその関連会社の商標です。関連コラム
RECOMMEND
その他のコラム
相談無料!プロが中立的にアドバイスいたします
クラウド・AWS・Azureでお困りの方はお気軽にご相談ください。