ライブストリーミングのシナリオでは、視聴者は通常、ストリーマーの戦闘状態、音量、ネットワーク状態など、同時ストリーミング情報をリアルタイムで把握したいと考えています。補足拡張情報 (SEI) を使用すると、フレームに同期キー情報を付加できます。このトピックでは、ApsaraVideo Real-time Communication (ARTC) で SEI を使用してフレームに同期キー情報を付加する方法について説明します。
クライアント SEI
クライアント SDK を使用して、カスタム情報を含む SEI をビデオフレームに挿入できます。ストリーマーと同時ストリーミングを行っている同時ストリーマーと視聴者は、どちらもカスタム情報を受信できます。
次のサンプルコードは、ストリーマーと同時ストリーマーが Alibaba Cloud Push SDK を呼び出して SEI を送受信する例を示しています。
Android のサンプルコード:
// SEI の送信: AlivcLivePusher#sendMessage。ストリーム取り込みクライアントがカスタムメッセージを送信します。 public void sendSEI(String text) { mAlivcLivePusher.sendMessage(text, 0, 0, false); } // SEI の受信: AlivcLivePlayInfoListener#onReceiveSEIMessage。メディア拡張情報のコールバックが受信されます。 @Override public void onReceiveSEIMessage(int payload, byte[] data) { //Log.d(TAG, "onReceiveSEIMessage: " + payload + ", " + new String(data, StandardCharsets.UTF_8)); }iOS のサンプルコード:
// AlivcLivePusher の sendMessage メソッドを呼び出して SEI を送信します。 [self.rtcPusher sendMessage:data repeatCount:1 delayTime:0 KeyFrameOnly:false]; // ストリーマーと同時ストリーマーは、AliLivePlayerDelegate の onReceiveSeiMessage コールバックから SEI を受信します。 - (void)onReceiveSeiMessage:(AlivcLivePlayer *)player payloadType:(int)payloadType data:(NSData *)data { if (data.bytes){ NSString *str = [NSString stringWithUTF8String:data.bytes]; } }
次のサンプルコードは、視聴者が ApsaraVideo Player を使用して SEI フレームを開いて解析する例を示しています。
Android のサンプルコード:
mAliPlayer = AliPlayerFactory.createAliPlayer(mContext); PlayerConfig playerConfig = mAliPlayer.getConfig(); // FLV 形式の音声のみまたはビデオのみのストリームの SEI フレーム解析を設定して、起動時間を短縮します。 // 再生開始バッファー。値が大きいほど、再生開始が安定します。ただし、値が大きすぎると、ストリームの再生開始にかかる時間が影響を受ける可能性があります。このパラメーターは適切に指定してください。 playerConfig.mStartBufferDuration = 1000; // 途切れからの回復に必要なキャッシュ。ネットワーク状態が悪い場合は、大きい値を指定します。音声のみのストリームの場合は 500、ビデオストリームの場合は 3000 に設定することをお勧めします。 playerConfig.mHighBufferDuration = 500; // SEI リスニングを有効にします。 playerConfig.mEnableSEI = true; mAliPlayer.setConfig(playerConfig); mAliPlayer.setAutoPlay(true); mAliPlayer.setOnErrorListener(errorInfo -> { mAliPlayer.prepare(); }); mAliPlayer.setOnSeiDataListener(new IPlayer.OnSeiDataListener() { @Override public void onSeiData(int i, byte[] bytes) { } });iOS のサンプルコード:
self.cdnPlayer = [[AliPlayer alloc] init]; self.cdnPlayer.delegate = self; AVPConfig *config = [self.cdnPlayer getConfig]; config.enableSEI = YES; [self.cdnPlayer setConfig:config]; // SEI 関連のコールバックをリッスンします。 - (void)onSEIData:(AliPlayer*)player type:(int)type data:(NSData *)data { if (data.bytes){ NSString *str = [NSString stringWithUTF8String:data.bytes]; // SEI メッセージを処理します。 } }
サーバー SEI
サーバー SEI には、システム SEI とカスタム SEI が含まれます。
システム SEI: ARTC サーバーによって自動的に生成されます。レイアウト、ストリーマーのマイクの状態、音量、カメラの状態、ネットワークの状態を記述するために使用されます。
カスタム SEI: サーバー側で API 操作を呼び出して、カスタムビジネス情報を送信します。
システム SEI
ストリーマーが同時ストリーミング状態になった場合、または同時ストリーミング状態から単一ストリーマー状態に戻った場合、ライブストリームのレイアウトが変更されます。この場合、クラウド内のストリームミキシングサーバーは、ビデオフレームに SEI を自動的に挿入するため、プレーヤーはレイアウトの変更を認識できます。ライブストリーミング中は、システム SEI を定期的に送信することも、キーフレームと共に送信することもできます。
クライアント SDK を使用してストリームミキシングおよびリレータスクを開始する前に、[apsaravideo Live コンソール] でシステム SEI 送信ポリシーを設定できます。詳細については、「ストリームリレーを設定する」の [SEI 挿入] に関する説明をご参照ください。
サーバー側で API 操作を呼び出してストリームミキシングおよびリレータスクを開始する場合は、SeiParams.LayoutVolume パラメーターを設定する必要があります。詳細については、「StartLiveMPUTask(新規)」または「UpdateLiveMPUTask(新規)」をご参照ください。
FollowIdr は、SEI をキーフレームと共に送信するかどうかを指定します。
Interval は、SEI を送信する間隔を指定します。
FollowIdr パラメーターの値が 0 に設定され、Interval パラメーターが指定されていない場合、SEI はレイアウトが変更されたとき、マイクの状態が変更されたとき、またはカメラの状態が変更されたときにのみ送信されます。SEI は定期的に送信されません。
カスタム SEI
カスタム SEI は、カスタムメッセージを送信するために使用されます。サーバー側で API 操作を呼び出してのみ、カスタム SEI を送信できます。API 操作の呼び出しでは、SeiParams.PassThrough パラメーターを設定する必要があります。詳細については、「StartLiveMPUTask(新規)」または「UpdateLiveMPUTask(新規)」をご参照ください。
PayloadContent は、カスタムメッセージを指定します。
FollowIdr は、SEI をキーフレームと共に送信するかどうかを指定します。
Interval は、SEI を送信する間隔を指定します。
FollowIdr パラメーターの値が 0 に設定され、Interval パラメーターが指定されていない場合、SEI は API 操作が呼び出されたときに一度だけ送信されます。SEI は定期的に送信されません。
SEI データ形式
次の図は、SEI のデータ形式を示しています。現在の SEI ペイロードタイプは 5 で、UserDataUnregistered です。
SEI ペイロードコンテンツの詳細については、「StartLiveMPUTask (new)」をご参照ください。