はじめに
ジェネリック ストリーム同時視聴制限(Generic Stream Concurrency および GSC)を使用すると、特定のユーザーが同時に視聴できる動画ストリームの数を定義することができます。 ストリームの同時視聴を制限することで、認証情報の盗難や不適切な共有によるコンテンツの不正視聴を防ぐことができます。
この機能は「再生制限(Playback Restrictions)」の一部であり、DRMを使用したストリーム同時視聴制限 の代替手段として利用することができます。
GSCを使用するタイミング
Brightcove は同時視聴管理のために2つのソリューションを提供しています:
- ジェネリック ストリーム同時視聴制限(本トピックで解説)
- DRMを使用したストリーム同時視聴制限
以下の表は、この2つのソリューションを比較したもので、どちらが適しているか判断するのに役立ちます。
ジェネリック ストリーム同時視聴制限 | DRMを使用したストリーム同時視聴制限 |
---|---|
メリット:
|
メリット:
|
デメリット:
|
デメリット:
|
動作の仕組み
ハートビート
ハートビートは、特定のユーザーのアクティブなセッションを一定間隔でリクエストし、再生全体を通じて有効なセッションであることを強制するメカニズムです。ハートビートは、Brightcove の Web プレーヤーおよびネイティブ SDK プレーヤーで有効にすることができます。
デフォルトの更新頻度は1分(最小値)に設定されています。より長い間隔に変更することも可能ですが、1分未満には設定することができません。
ストリームのブロック
許可された同時ストリーム数の上限に達した状態で、視聴者またはそのアカウント情報を使用した第三者が追加のストリームを開こうとすると、別のストリーミング場所として識別されたそのユーザーからの新しいストリームはブロックされます。
Correlator identifier (コリレータ識別子)
コリレータ(相関器)識別子は、視聴者のストリーミング場所を定義するために使用されます。その特徴は以下のとおりです:
- 同じ視聴者からのすべてのリクエストを適切に関連付けるため、十分に特定性の高い値である必要があります。識別子が一般的すぎると、複数の視聴者が同じ視聴者IDでグループ化されてしまう可能性があります。
- 同じ視聴者が視聴するすべての動画で一貫性を保つ必要があります。
「コリレータ」が異なる場合、視聴者IDに対する「スロット」を埋めようとします。そのため、視聴中にこの値が変更されると、異なる視聴者として認識され、再生が妨げられる可能性があります。
コリレータは JWT 内のsid
クレームを使用して設定されます。
実装方法
Brightcove Web プレーヤーまたは SDK プレーヤーを使用する場合
- デフォルトのハートビート頻度(1分)を変更したい場合は、弊社サポートにお問い合わせください。
-
JWTを作成し、再生制限を適用します。
以下のクレームが必須です:
-
climit
- 同時視聴制限。何人の視聴者またはストリームが同時に再生可能かを示します。 -
uid
- 視聴者識別子。複数のセッションを関連付けてストリーム同時視聴制限を適用するために使用されます。 -
sid
- コリレータ識別子。視聴者のストリーミング場所を定義します。例:
- Chrome MAC (Cadmium) HTML 5 - 1112223334
- Apple iPad 7th Gen 10.2 (Wi-Fi) - 2223334444
- Apple Apple TV TBD Apple TV - 3334445555
- Android DefaultWidevineL3Phone Android Phone - 1112224567
- Firefox MAC (Cadmium) HTML 5 - 1112226754
- Google Chromecast streaming stick - 1112346677
-
- Brightcove に JWT の公開鍵を登録してください。詳細は、認証APIの使用 をご覧ください。
- クライアント プレーヤーでジェネリック ストリーム同時視聴制限を有効にする方法については、以下の プレーヤーでの実装 セクションをご参照ください。
サンプル JSON Web Token (JWT) クレーム
{
// アカウント id: JWTはこのアカウントでのみ有効
"accid":"4590388311111",
// 同時接続ユーザー数の制限
"climit": 3,
// ユーザー id
"uid": "108.26.184.3_1634052241",
// コリレータ識別子
"sid": "Firefox MAC (Cadmium) HTML 5 - 1112346677"
}
注意事項
- 視聴者のセッション数が上限を超えた場合、セッションが停止されます。ただし、停止が完了するまでにハートビートの間隔分の時間がかかることがあります。
- クライアント プレーヤーがサーバーに接続できない場合、3回再試行されます。それでも接続できない場合、再生は停止されます。
プレーヤーでの実装
必要条件
- ジェネリック ストリーム同時視聴制限(GSC)は、Brightcove Web プレーヤー 6.63.2 以降で利用可能です。
- Brightcove iOS SDKプレーヤー 6.10.1 以降が必要です。
- Brightcove Android SDKプレーヤー 6.17.2 以降が必要です。
Brightcove Web プレーヤー
Brightcove プレーヤーでジェネリック ストリーム同時視聴制限を有効にするには、プレーヤー設定で video_cloud.stream_concurrency
を使用します。
現在、この機能に特化した UI は Studio にはないため、JSONエディターを使用して設定を追加する必要があります。設定例は以下のとおりです:
"stream_concurrency" : true
...
"video_cloud": {
"stream_concurrency": true,
"policy_key": "BCpk..."
},
"player": {
"template": {
"name": "single-video-template",
"version": "6.63.1"
}
},
...
このキー/値ペアがJSONに存在しない、または値が false の場合、プレーヤーで GSC 機能は有効になりません。
JWTの設定(実行時)
ジェネリック ストリーム同時視聴制限は、EPAのストリーム同時視聴制限機能と同様に、JSON Web Token(JWT)に依存します。
プレーヤーの設定が完了したら、次のステップは実行時に JWT をプレーヤーに提供することです。これは EPA の設定と同じ手順です。
player.catalog.setBcovAuthToken('your token');
例
JWT トークンを追加した後、Playback API からデータを取得し、プレーヤーにロードします。この例では単一の動画を取得しています。
// 認証トークンを設定
player.catalog.setBcovAuthToken('your token');
// カタログリクエストを開始(API選択は呼び出すたびに行われる)
player.catalog.get({id: '1', type: 'video'}).
then(function(data) {
// リクエスト完了後、取得したメタデータとソースをプレーヤーにロード
player.catalog.load(data);
}).
catch(function(error) {
throw new Error(error);
});
iOS
iOS SDK でジェネリック ストリーム同時視聴制限を有効にするには、playbackController
の streamConcurrencyEnabled
を有効にします。
また、sid
の値をオプションで指定できます。sid
を指定しない場合、この値はヘッダーに送信されません。
Objective-C
self.playbackController.streamConcurrencyEnabled = YES;
// オプション:カスタム sid を設定
self.playbackController.options = @{ kBCOVAuthHeartbeatPropertyKeySessionld: "sessionId" };
Swift
self.playbackController.streamConcurrencyEnabled = true
// オプション:カスタム sid を設定
self.playbackController.options = [ kBCOVAuthHeartbeatPropertyKeySessionld: "sessionId" ]
詳細については、Brightcove iOS SDKリファレンス をご覧ください。
Android
プレーヤーのアクティビティの onCreate
メソッドに次の行を追加してください:
brightcoveVideoView.setStreamConcurrencyEnabled(true);
onCreate
メソッド内で DID_SET_VIDEO
イベント用のリスナーを追加し、ハートビートヘッダーを設定してください。
この JWT は動画取得時に使用したものと同じであり、uid
(オプションで sid
も)を含める必要があります。
Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put(ConcurrencyClient.HEARTBEAT_VIDEO_HEADER_KEY, video.getId());
requestHeaders.put(ConcurrencyClient.HEARTBEAT_ACCOUNTID_HEADER_KEY, accountId);
requestHeaders.put(BrightcoveTokenAuthorizer.BRIGHTCOVE_AUTHORIZATION_HEADER_KEY, jwtToken);
brightcoveVideoView.setStreamConcurrencyRequestHeaders(requestHeaders);
APIによる実装
この機能は、Brightcove Web プレーヤーや SDK プレーヤーを使用せずに、Concurrency Service API を通じて実装することができます。詳細は、APIリファレンスをご参照ください。
Concurrency Service API の基本URLは以下のとおりです:
https://edge-gsc.api.brightcove.com
認証は、Authorization
ヘッダーに JWT を送信することで行われます:
Authorization: Bearer {token}
プレーヤーやアプリが実行する基本的なロジックは、以下の図のとおりです:
API エンドポイント
- セッション作成
-
このエンドポイントは、新しいストリーミングセッションを作成し、同時視聴管理のためのハートビートを設定するために使用されます:
/api/v1/accounts/{{account_id}}/sessions
メソッド:
POST
リクエストボディ:
{ "video": "the_video_id" }
- アクティブセッションの取得
-
このエンドポイントを使用すると、現在のストリーミングセッションの一覧を取得できます。同時視聴の上限に達した際に、どのセッションを停止するかを決定するロジックを実装する際に役立ちます:
/api/v1/accounts/{{account_id}}/sessions
メソッド:
GET
- セッションの停止
-
このエンドポイントを使用すると、ストリーミングセッションを停止できます。新しい再生リクエストが同時視聴制限を超えた場合、どのセッションを停止するかを決定するロジックを実装する際に利用します。主にバックエンド側で、不要なセッションを削除するために使用されます:
/api/v1/accounts/{{account_id}}/sessions
メソッド:
DELETE