はじめに
ジェネリック ストリーム同時視聴制限(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.2 以降が必要です。
- 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 を有効にします。動画の取得とハートビートリクエストの認証には同じ JWT を使用します。JWT には uid と climit を含める必要があります。再生サービスへの JWT の渡し方については、iOS:ライセンスキー保護の使用を参照してください。
実装セクションで説明しているとおり、sid も指定する必要があります。JWT に含めるか、再生コントローラーのオプションで設定してください。両方を指定した場合は、JWT のクレームがオプションより優先されます。カスタム sid を設定するときは、既存のオプションを保持してください。
Objective-C
self.playbackController.streamConcurrencyEnabled = YES;
// JWT に sid が含まれない場合は、既存のオプションを保持してカスタム sid を設定します。
NSMutableDictionary *options = [self.playbackController.options mutableCopy] ?: [NSMutableDictionary dictionary];
options[kBCOVAuthHeartbeatPropertyKeySessionId] = @"sessionId";
self.playbackController.options = options;
Swift
self.playbackController.streamConcurrencyEnabled = true
// JWT に sid が含まれない場合は、既存のオプションを保持してカスタム sid を設定します。
var options = self.playbackController.options ?? [:]
options[kBCOVAuthHeartbeatPropertyKeySessionId] = "sessionId"
self.playbackController.options = options
詳細については、Brightcove iOS SDKリファレンス をご覧ください。
Android
プレーヤーのアクティビティの onCreate メソッドで、再生を開始する前に次の行を追加してください:
brightcoveVideoView.enableStreamConcurrency();
Android SDK 6.17.2 から 9.2.0 では、代わりに brightcoveVideoView.setStreamConcurrencyEnabled(true) を呼び出してください。このメソッドは、enableStreamConcurrency() が追加された 9.2.1 で非推奨になりました。
onCreate 内で動画をロードする前に、DID_SET_VIDEO イベントのリスナーを登録し、ハートビートヘッダーを設定してください。HttpRequestConfig.Builder.setBrightcoveAuthorizationToken を使用してカタログリクエストに渡したものと同じ JWT を使用します。JWT には uid、climit、sid の各クレームを含める必要があります。Android SDK には sid を設定する別の API はありません。サンプルでは com.brightcove.player.event.Event、com.brightcove.player.event.EventType、com.brightcove.player.model.Video、com.brightcove.player.concurrency.ConcurrencyClient、com.brightcove.player.edge.BrightcoveTokenAuthorizer を使用します。
String accountId = getString(R.string.sdk_demo_account);
String jwtToken = "..."; // カタログリクエストで使用したものと同じ JWT。
brightcoveVideoView.getEventEmitter().on(EventType.DID_SET_VIDEO, event -> {
Video video = (Video) event.properties.get(Event.VIDEO);
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
GSC エラーコード
| エラーコード | 説明 |
|---|---|
| GSC_ERR_DENIED_BY_CONCURRENCY_LIMITING | この動画のセッション数が上限に達し、同時視聴制限が適用されています。 |
| GSC_SESSION_STOPPED | プレーヤーによる同時視聴制限の状態確認(ハートビート)が複数回の再試行後も継続的に失敗すると、このエラーが発生します。ハートビートリクエストをブロックして同時視聴制限を回避することを防ぐため、再生は停止します。 |
| GSC_INVALID_TOKEN | 提供された JWT が有効ではありませんでした。 |
| GSC_PLAYBACK_RESTRICTIONS | 特定の再生制限の要件が満たされていません。 |
| GSC_SESSION_NOT_FOUND | セッションが存在しないため、存在しないセッションに対して同時視聴ルールを適用できません。 |