Google CloudのLive Stream APIでDRM機能が2023年2月末にリリースされました。まだ登場したばかりの この新機能の実装方法が分からず、お困りの方への助けとなればと、本記事ではLive Stream APIでのDRMライブ配信を実現する方法について記述していきます。
前提
- Google Cloudのアカウント作成、Google Cloud CLIのインストール、プロジェクト作成等については省略します。
- まだ環境を整えていない方は、下記リンクを参考に ご準備ください。
https://cloud.google.com/livestream/docs/quickstarts/quickstart-dash?hl=ja
- まだ環境を整えていない方は、下記リンクを参考に ご準備ください。
- 本記事では、Live Stream API の DRM機能に焦点を当て解説していきます。Live Stream API全体の利用方法や詳細については、Google Cloud Live Stream APIのドキュメントを参照ください。
- Live Stream APIには、Googleから Go、Python、.NETなどのクライアントSDKが提供されていますが、本記事執筆時点(2023年3月時点)では、まだDRM機能の実装が済んでいないため、本記事ではREST APIを使用した手順について ご紹介いたします。
- 説明を簡略化するために配信形式については、Widevine+CENC(MPEG-DASH)のみとしております。
- ライブ配信映像の送信には、「OBS Studio」を使用します。
- OBS Studioはオープンソースのライブ配信ソフトウェアです。以下リンクよりダウンロードできます。
Live Stream API の DRM機能 の全体像

上図は、Live Stream APIの全体像となります。図中の各リソースについての簡単に説明しておきます。
INPUT | Live Stream APIの入力エンドポイント。 RTMP(PUSH)とSRTをサポートしています。ドキュメントではSRTが推奨されていますが、本記事ではRTMPを使用します。 |
CHANNEL | Live Stream APIのチャネル リソース(以下、単にチャネル)。 入力エンドポイントで受け取ったストリームを配信形式にパッケージングします。DRM暗号化を行うのもチャネルとなります。 |
Secret Manager | API キーやパスワード、証明書などの機密データをセキュアに保存するサービス。 チャネルがDRM暗号化する際に利用する暗号鍵などの情報を予め登録しておきます。 |
Output Storage | Cloud Storageのバケット(以下、単にバケット)。 ライブ配信ストリームファイルが、ここに保存されます。ライブ配信を停止すると、ストリームファイルは自動的に削除されます。 |
CDN | CDN(Content Delivery Network)。本記事では使用しません。 |
全体の流れとしては、以下のようになります。
- 入力エンドポイントを作成
- バケットを作成
- Secret ManagerにDRM暗号化に必要な暗号鍵等の情報を登録
- チャネルを作成
- 配信開始
次の項からは、各ステップにおけるポイントや具体的な手順を解説していきます。
1.入力エンドポイントの作成
入力エンドポイントの作成方法については、Googleのドキュメントを参照してください。
https://cloud.google.com/livestream/docs/how-to/create-input-endpoints?hl=ja
本記事では、作成したインプット名は「input-how-to-drm-livestream」としています。一点、OBS Studioから入力エンドポイントに向けてRTMP_PUSH配信する場合は、入力エンドポイント作成時に返ってくるURIを下記のように、OBS Studioの設定画面で指定ください。
// 入力エンドポイント作成APIのレスポンス { "name": "projects/{PROJECT_NUMBER}/locations/asia-northeast1/inputs/input-how-to-drm-livestream", "createTime": "2023-03-16T08:04:08.655562979Z", "updateTime": "2023-03-16T08:04:08.716730704Z", "type": "RTMP_PUSH", "uri": "rtmp://{IPアドレス}/live/22d05596-6a17-4722-850b-5c905c7acc4b", "tier": "HD" }

2.バケットの作成
バケット作成においても、Googleのドキュメントを参考に作成いただければ問題ございません。
https://cloud.google.com/livestream/docs/quickstarts/quickstart-dash?hl=ja#create_bucket
本記事では、「bucket-how-to-drm-livestream」というバケットを作成し説明していきます。

ちなみに、Live Stream APIからバケットにアクセスする際のIAM権限は、最初のライブ ストリーミング イベントが発生したタイミングで自動的に付与されます。
https://cloud.google.com/livestream/docs/access-control?hl=ja#access_to_gcs
3.Secret Managerへの登録
こちらについても、Googleのドキュメント通りに進めていけば問題ございません。
https://cloud.google.com/livestream/docs/how-to/encrypt-content?hl=ja#add-encryption-key
なお、より深い理解のためには、チャネル作成時に使用するJSONと、暗号鍵情報JSONの構造・関係について理解しておく必要があるため、そちらについては また別の記事で解説していきます。まずは、シークレット作成の流れを簡単に確認していきましょう。
1.シークレットを作成
本記事では、「secret-how-to-drm-livestream」という名前で作成し、シークレットの値としては、ドキュメントに記載されているJSONを一度ファイルとして、ローカルに保存(本記事では、encryptionkey.json)しておき、それをアップロードして登録します。

下図が作成されたシークレットとなります。「projects/{PROJECT_NUMBER}/secrets/secret-how-to-drm-livestream」という値は、後にチャネル作成時に使用しますので控えておいてください。

2.シークレットへの権限付与
作成されたシークレットには、Live Stream APIが暗号鍵情報を取得しにアクセスが来るため、アクセス権の設定をしておきます。

プリンシパルには「service-{PROJECT_NUMBER}@gcp-sa-livestream.iam.gserviceaccount.com」を追加し、ロールについては「Secret Manager」の「Secret Managerのシークレット アクセサー(secretmanager.secretAccessor)」を付与しましょう。

4.チャネルを作成
最後にチャネルを作成すれば配信準備は整います。チャネルの作成方法についてはドキュメントを参照いただければと思いますが、DRM部分については注意点がありますので、そちらについて説明しておきます。
https://cloud.google.com/livestream/docs/how-to/create-channels?hl=ja
本記事で使用するチャネル作成時のリクエストJSONについては、ドキュメントにある「例(FP/PR/Widevine)」からWidevine+CENCの部分のみを抽出し作成しています。下記JSONの値は、適宜置き換えていただいて ご使用ください。ただ、ドキュメントにある例では、「encryptions[].secretManager」となっていますが、正しくは「encryptions[].secretManagerKeySource」となりますので、ご注意ください。
{ "inputAttachments": [ { "key": "input-how-to-drm-livestream", "input": "projects/{PROJECT_NUMBER}/locations/asia-northeast1/inputs/input-how-to-drm-livestream" } ], "output": { "uri": "gs://bucket-how-to-drm-livestream" }, "elementaryStreams": [ { "key": "es_video", "videoStream": { "h264": { "profile": "main", "widthPixels": 1920, "heightPixels": 1080, "bitrateBps": 2500000, "frameRate": 30 } } }, { "key": "es_audio", "audioStream": { "codec": "aac", "channelCount": 2, "bitrateBps": 160000 } } ], "encryptions": [ { "id": "widevine-cenc", "secretManagerKeySource": { "secretVersion": "projects/{PROJECT_NUMBER}/secrets/secret-how-to-drm-livestream/versions/1" }, "drmSystems": { "widevine": {} }, "mpegCenc": { "scheme": "cenc" } } ], "muxStreams": [ { "key": "fmp4_widevine_cenc_video", "container": "fmp4", "elementaryStreams": [ "es_video" ], "segmentSettings": { "segmentDuration": "2s" }, "encryptionId": "widevine-cenc" }, { "key": "fmp4_widevine_cenc_audio", "container": "fmp4", "elementaryStreams": [ "es_audio" ], "segmentSettings": { "segmentDuration": "2s" }, "encryptionId": "widevine-cenc" } ], "manifests": [ { "fileName": "manifest_widevine_cenc.mpd", "type": "DASH", "muxStreams": [ "fmp4_widevine_cenc_video", "fmp4_widevine_cenc_audio" ], "maxSegmentCount": 10 } ] }
5.配信開始
以上で配信の準備は整いました。ドキュメントの「ストリーミングを開始する」にあるように、チャネルを「開始」し、OBS Studioなどからライブ配信を開始してみましょう。
なお、「チャネルの詳細情報の取得」で問題なくDRMの設定ができているかを確認しておきましょう。「streamingState」が「AWAITING_INPUT」であれば正常、「STREAMING_ERROR」であればSecret Managerへのアクセス権が設定されているかなどを見直してください。
無事にライブ配信を開始すると、空っぽであったバケットに DRMライブ配信ストリーム用のファイルが出来ていることが確認できます。

さいごに
以上、本記事ではGoogle Cloud の Live Stream APIでDRMライブ配信をする方法を簡単に説明していきましたが、記事の中でも触れていますように、より深いを助けるために暗号鍵情報JSONとチャネル作成時のJSONの構造や関係を理解しておく必要がございます。そのため、次回の記事では、それらについての解説記事を予定しています。
また、Live Stream APIでDRMライブ配信をする際には、弊社の『Multi DRM Kit』をご利用いただけますので、詳細について知りたいなどございましたら、お気軽にお問い合わせください。