ApsaraVideo Liveは、ストリーマーが共同ストリーマーになるビューアと対話できるようにする共同ストリーミング機能を提供します。 このトピックでは、コストリーミングの実装方法と関連するサンプルコードについて説明します。
コストリーミングの実装方法の概要
Push SDKインタラクティブエディションは、ApsaraVideo Real-time Communication (ARTC) に基づくコストリーミングを実装しています。 これにより、ユーザーはより多くの人を超低遅延で引き付けるインタラクティブなストリーミングを開始できます。
共同ストリーミングの前: ストリーマーはARTCベースの共同ストリーミングの取り込みURLを使用してストリームを取り込み、ビューアはCDNからストリームをプルします。
コストリーミング中: 視聴者はコストリーマになります。 コストリーマは、ARTCベースのコストリーミング用の取り込みURLを使用してストリームを取り込み、ARTCベースのコストリーミング用のストリーミングURLを使用して、ストリーマのストリームを超低レイテンシでプルする。 ストリーマは、ARTCベースのコストリーミング用のストリーミングURLを使用して、コストリーマのストリームを超低レイテンシでプルします。
コストリーミング後: コストリーマは普通の視聴者になります。 視聴者によるARTCベースのストリーム取り込みおよびストリームプルは停止される。 視聴者はCDNからストリームを再度取得します。
使用上の注意
次のセクションでは、Push SDKのインタラクティブエディションをコストリーミングに使用する方法について説明します。
Push SDKのインタラクティブエディションを統合する方法の詳細については、以下のトピックを参照してください。
コストリーミングモードでは、ストリーマーとコストリーマーはAlivcLivePlayerオブジェクトのみを使用して、お互いのストリームを再生できます。 AlivcLivePlayerオブジェクトは、URLがartc:// live.aliyun.com/play/
で始まるストリームのみをサポートします。
ステップ1: コストリーミング機能を有効にする
コストリーミング機能を有効にする方法については、「コストリーミングを開始する」をご参照ください。
ステップ2: コストリーミング用の取り込みURLとストリーミングURLの生成
ストリーマーと共同ストリーマーの取り込みURLとストリーミングURL、および視聴者のCDNストリーミングURLは、ApsaraVideo Liveコンソールを使用して生成するか、連結ルールを使用して作成できます。
方法1: コンソールを使用してURLを生成する
ApsaraVideo LiveコンソールのURLジェネレーターを使用して、ストリーマーと共同ストリーマーの取り込みURLとストリーミングURL、および視聴者のCDNストリーミングURLを生成できます。 詳細については、「共同ストリーミングURLジェネレーター」をご参照ください。
方法2: URLを作成する
コンソールを使用して生成されるストリーマと共同ストリーマの取り込みURLとストリーミングURLのトークンは一時的なもので、通常はテストに使用されます。 ビジネス目的で使用される取り込みURLとストリーミングURLが必要な場合は、セキュリティ上の理由から連結ルールを使用してURLを構築します。 連結ルールを使用して構築するURLのトークンは、SHA-256暗号化アルゴリズムを使用して、SdkAppID、AppKey、ルームID、UserID、およびタイムスタンプに基づいて計算されます。 これらのトークンは、より高いセキュリティを提供する。 詳細については、「コストリーミングシナリオでのストリーマとコストリーマの取り込みとストリーミングURL」および「視聴者のCDNストリーミングURL」をご参照ください。
ステップ3: ストリーム取り込みに関連するオブジェクトを作成する
このステップは、ストリーマ側とコーストリーマ側の両方で必要です。
AlivcLivePushConfigオブジェクトの作成
ストリーム取り込みの設定に使用されるAlivcLivePushConfigオブジェクトを作成します。 livePushModeをAlivcLivePushInteractiveModeに設定し、解像度、フレームレート、ビットレートなどのパラメーターを設定します。
重要 AndroidまたはiOSのネイティブクライアントとwebの間でコストリーミングを実装する場合は、ネイティブクライアントでHTML5互換モードを有効にする必要があります。 それ以外の場合、web上のユーザーは、ネイティブクライアントのユーザーから送信された黒い画面が表示されます。 HTML5互換モードを有効にするには、NativeクライアントでAlivcLivePushConfig#setH5CompatibleModeを呼び出します。 詳細については、ネイティブSDKのAPIリファレンスをご参照ください。
Androidのサンプルコード
// Initialize the class for stream ingest configurations.
mAlivcLivePushConfig = new AlivcLivePushConfig();
// Specify the stream ingest mode. By default, the regular stream ingest mode is used.
mAlivcLivePushConfig.setLivePushMode(AlivcLiveMode.AlivcLiveInteractiveMode);
// Specify the resolution. The default resolution is 540p.
mAlivcLivePushConfig.setResolution(AlivcResolutionEnum.RESOLUTION_540P);
// Specify the frame rate. The default frame rate is 20 frames per second (FPS).
mAlivcLivePushConfig.setFps(AlivcFpsEnum.FPS_25);
// Specify the group of pictures (GOP) size. Unit: seconds. The default GOP size is 2 seconds.
mAlivcLivePushConfig.setVideoEncodeGop(AlivcVideoEncodeGopEnum.GOP_TWO);
// Specify whether to enable adaptive bitrate streaming. The default value is true.
mAlivcLivePushConfig.setEnableBitrateControl(true);
// Specify the screen orientation. The default screen orientation is portrait. You can configure the settings that allow you to press the Home key to change the orientation to landscape left or landscape right.
mAlivcLivePushConfig.setPreviewOrientation(AlivcPreviewOrientationEnum.ORIENTATION_PORTRAIT);
// Specify the audio encoding format. The default format is AAC-LC.
mAlivcLivePushConfig.setAudioProfile(AlivcAudioAACProfileEnum.AAC_LC);
// Specify the video encoding mode. By default, hardware encoding is used.
mAlivcLivePushConfig.setVideoEncodeMode(AlivcEncodeModeEnum.Encode_MODE_HARD);
// Specify the audio encoding mode. By default, software encoding is used.
mAlivcLivePushConfig.setAudioEncodeMode(AlivcEncodeModeEnum.Encode_MODE_SOFT);
// Specify whether to use the front camera or the rear camera. By default, the front camera is used.
mAlivcLivePushConfig.setCameraType(AlivcLivePushCameraTypeEnum.CAMERA_TYPE_FRONT);
// Specify the image that is ingested when your app is switched to the background or video stream ingest is paused.
mAlivcLivePushConfig.setPausePushImage("TODO: Image Path");
// Specify the image that is ingested in poor network conditions.
mAlivcLivePushConfig.setNetworkPoorPushImage("TODO: Image Path");
iOSのサンプルコード
AlivcLivePushConfig *rtcPushConfig = [[AlivcLivePushConfig alloc] init];
rtcPushConfig.livePushMode = AlivcLivePushInteractiveMode;
rtcPushConfig.resolution = AlivcLivePushResolution540P;
rtcPushConfig.fps = AlivcLivePushFPS20;
rtcPushConfig.enableAutoBitrate = true;
rtcPushConfig.orientation = AlivcLivePushOrientationPortrait;
rtcPushConfig.enableAutoResolution = YES;
Windowsのサンプルコード
AlivcLivePushConfig config_;
config_.mTargetVideoBitrate = video_bitrate_;
config_.audioProfile = AlivcLiveHighQualityMode;
config_.audioProfile = AlivcLiveStereoHighQualityMode;
config_.height = 720;
config_.width = 1280;
if (config_.height > config_.width) {
config_.mPreviewOrientation =
AlivcLivePreviewOrientationPortRait;
} else {
config_.mPreviewOrientation =
AlivcLivePreviewOrientationLandscape;
}
config_.frameRate = AlivcLiveFrameRateFps30;
config_.mVideoEncodeGop = AlivcLiveVideoEncodeGopTwo;
config_.mResolution = AlivcLiveResolutionSelfDefine;
config_.externMainStream = true;
config_.mLivePushMode = AlivcLiveInteractiveMode;
AlivcLivePusherオブジェクトの作成
実践1: 共同ストリーマーは、オーディオコストリーミングまたはビデオコストリーミングのいずれかを選択できますが、それらを切り替えることはできません
ストリームがオーディオのみのストリームである場合、AlivcLivePushConfigオブジェクトを作成するときに、ストリームがオーディオのみのストリームであることを指定する次のコードを追加します。
ストリームがオーディオのみのストリームでない場合は、次のコードを追加しないでください。 オーディオのみのストリームの場合、ストリームの取り込みを開始する前に、ストリームのプレビューに使用されるメソッドを呼び出す必要はありません。 代わりに、ストリームの取り込みを開始するために使用されるメソッドを直接呼び出すことができます。
Androidのサンプルコード
mAlivcLivePushConfig.setAudioOnly(true);
iOSのサンプルコード
rtcPushConfig.audioOnly = YES;
Windowsのサンプルコード
config_.mAudioOnly = true;
実践2: 共同ストリーマーは、いつでもオーディオコストリーミングとビデオコストリーミングを切り替えることができます
コストリーマがオーディオコストリーミングとビデオコストリーミングを切り替える方法の詳細については、「コストリーマがオーディオコストリーミングとビデオコストリーミングを切り替えるときに使用するソリューション」をご参照ください。
共同ストリーミングモードでストリームの取り込みを開始する
共同ストリーミングの取り込みURLを使用してストリームを取り込みます。 取り込みURLを取得する方法の詳細については、「手順2: コストリーミング用の取り込みURLとストリーミングURLの生成」をご参照ください。
Androidのサンプルコード
alivcLivePusher.startPreview(context, frameLayout, isAnchor); // The preview settings for the streamer whose stream is displayed in the bigger window. Set isAnchor to true.
alivcLivePusher.startPushAysnc("artc://live.aliyun.com/push/6375?timestamp=1661596947&token=XXX&userId=7135&sdkAppId=XXX"); // The ingest URL of the streamer or co-streamer.
iOSのサンプルコード
[rtcPusher startPushWithURL:@"artc://live.aliyun.com/push/6375?timestamp=1661596947&token=XXX&userId=7135&sdkAppId=XXX"]; // The ingest URL of the streamer or co-streamer.
Windowsのサンプルコード
pusher_->startPush("artc://live.aliyun.com/push/6375?timestamp=1661596947&token=XXX&userId=7135&sdkAppId=XXX");
ステップ4: CDN再生用のAliPlayerオブジェクトの作成
このステップは、視聴者側で必要とされる。
CDN再生にAliPlayerオブジェクトを使用するには、まず視聴者のCDNストリーミングURLを取得します。 詳細については、「手順2: コストリーミング用の取り込みURLとストリーミングURLの生成」をご参照ください。
重要 ビューアのCDNストリーミングURLについては、Real-Time Messaging Protocol (RTMP) 形式の代わりにHTTP-FLV形式を使用することを推奨します。
ApsaraVideo Liveコンソールを使用してURLを生成すると、RTMPおよびHTTP-FLV形式のURLが生成されます。 RTMPフォーマットのURLとHTTP-FLVフォーマットのURLは、同じデータコンテンツを含むが、異なるプロトコルを使用する。 HTTPは、インターネットを介して情報を送信するための主要なプロトコルである。 Alibaba Cloud CDN、インターネットサービスプロバイダー (ISP) 、仲介デバイス間の接続など、HTTPプロトコルを介した接続は高度に最適化されています。 HTTPプロトコルのデフォルトポートは80で、HTTPSプロトコルのデフォルトポートは443です。 ほとんどの場合、ポートはホワイトリストに追加され、無効にすることはできません。 RTMPは古いプロトコルであり、デフォルトポートとして1935を使用します。 ポート1935は、ファイアウォールによって無効にすることができる。 これにより、エラーが発生する可能性があります。
RTMPと比較して、HTTP-FLVはより安定しており、より良いパフォーマンスを提供します。 例えば、HTTP-FLV上のビデオ再生は、RTMPよりも低いスタッターレート及び低いレイテンシを有する。
ストリームがオーディオのみのストリームである場合、最初のフレームの再生を高速化するように再生開始バッファを設定する必要があります。 この場合、HTTP-FLV形式のストリーミングURLを使用することも推奨します。
説明 ストリームがビデオストリームの場合、再生開始バッファを設定する必要はありません。 オーディオのみのストリームに使用されるストリーミングURLの詳細については、「視聴者のCDNストリーミングURL」をご参照ください。
Androidのサンプルコード
mAliPlayer = AliPlayerFactory.createAliPlayer(mContext);
PlayerConfig playerConfig = mAliPlayer.getConfig();
// The playback start buffer. A larger value indicates more stable playback start. However, a too large value may affect the time it takes to start playing the stream. Specify this parameter as appropriate.
playerConfig.mStartBufferDuration = 1000;
// The cache required for stuttering to recover. Specify a larger value in poor network conditions. We recommend that you set the value to 500 for an audio-only stream or 3000 for a video stream.
playerConfig.mHighBufferDuration = 500;
mAliPlayer.setConfig(playerConfig);
mAliPlayer.setAutoPlay(true);
iOSのサンプルコード
self.cdnPlayer = [[AliPlayer alloc] init];
self.cdnPlayer.delegate = self;
self.cdnPlayer.autoPlay = YES;
// Configure the playback start buffer to speed up the playback of the first frame if the stream is an audio-only stream.
AVPConfig *config = [self.cdnPlayer getConfig];
config.enableStrictFlvHeader = YES; // Specify this parameter if the stream is an audio-only stream or a video stream in the FLV format.
config.startBufferDuration = 1000; // The playback start buffer. A larger value indicates more stable playback start. However, a too large value may affect the time it takes to start playing the stream. Specify this parameter as appropriate.
config.highBufferDuration = 500;// The cache required for stuttering to recover. Specify a larger value in poor network conditions. We recommend that you set the value to 500 for an audio-only stream or 3000 for a video stream.
[self.cdnPlayer setConfig:config];
ステップ5: 共同ストリーミングを開始する
ストリーマーAはARTCに基づいてストリームを取り込みます
Streamer AはAlivcLivePusherオブジェクトを使用してストリームの取り込みを開始します。
Androidのサンプルコード
alivcLivePusher.startPreview(context, frameLayout, isAnchor);
alivcLivePusher.startPushAysnc("artc://live.aliyun.com/push/123?timestamp=1661596947&token=XXX&userId=userA&sdkAppId=XXX"); // The ingest URL of the streamer.
iOSのサンプルコード
[rtcPusher startPushWithURL:@"artc://live.aliyun.com/push/123?timestamp=1661596947&token=XXX&userId=userA&sdkAppId=XXX"]; // The ingest URL of the streamer.
Windowsのサンプルコード
pusher_->startPush("artc://live.aliyun.com/push/6375?timestamp=1661596947&token=XXX&userId=7135&sdkAppId=XXX");
視聴者はCDNストリーミングURLを使用してStreamer aのストリームを再生します
すべてのビューアはAliPlayerオブジェクトを使用してStreamer Aのストリームを再生します。
Androidのサンプルコード
AliPlayer aliPlayer = AliPlayerFactory.createAliPlayer(context);
aliPlayer.setAutoPlay(true);
aliPlayer.setOnErrorListener(errorInfo -> {
aliPlayer.prepare();
});
UrlSource urlSource = new UrlSource();
urlSource.setUri("http://test.alivecdn.com/live/streamId.flv?auth_key=XXX"); // The CDN streaming URL of viewers.
aliPlayer.setDataSource(urlSource);
aliPlayer.prepare();
iOSのサンプルコード
AliPlayer *cdnPlayer = [[AliPlayer alloc] init];
cdnPlayer.delegate = self;
cdnPlayer.autoPlay = YES;
AVPUrlSource *source = [[AVPUrlSource alloc] urlWithString:@"http://test.alivecdn.com/live/streamId.flv?auth_key=XXX"]; // The CDN streaming URL of viewers.
[self.cdnPlayer setUrlSource:source];
[self.cdnPlayer prepare];
ビューアDが共同ストリーミングを開始
ビューアDはAlivcLivePusherオブジェクトを作成し、コストリーミング用の取り込みURLを使用してストリームを取り込みます。 この場合、ビューアDはコストリーマになる。
Androidのサンプルコード
// Initialize the class for stream ingest configurations.
AlivcLivePushConfig alivcLivePushConfig = new AlivcLivePushConfig();
alivcLivePushConfig.setLivePushMode(AlivcLiveMode.AlivcLiveInteractiveMode);
// Set the resolution to 540p. The supported maximum resolution is 720p.
alivcLivePushConfig.setResolution(AlivcResolutionEnum.RESOLUTION_540P);
// We recommend that you set the frame rate to 20 FPS.
alivcLivePushConfig.setFps(AlivcFpsEnum.FPS_20);
// Specify whether to enable adaptive bitrate streaming. The default value is true.
alivcLivePushConfig.setEnableBitrateControl(true);
// The default screen orientation is portrait. You can configure the settings that allow you to press the Home key to change the orientation to landscape left or landscape right.
alivcLivePushConfig.setPreviewOrientation(AlivcPreviewOrientationEnum.ORIENTATION_PORTRAIT);
// Specify the audio encoding format.
alivcLivePushConfig.setAudioProfile(AlivcAudioAACProfileEnum.AAC_LC);
AlivcLivePusher alivcLivePusher = new AlivcLivePusher();
alivcLivePusher.init(context, alivcLivePushConfig);
alivcLivePusher.setLivePushErrorListener(new AlivcLivePushErrorListener() {});
alivcLivePusher.setLivePushInfoListener(new AlivcLivePushInfoListener() {});
alivcLivePusher.setLivePushNetworkListener(new AlivcLivePushNetworkListener() {});
alivcLivePusher.startPreview(context, frameLayout, isAnchor); // The preview settings for the co-streamer. Set isAnchor to false.
alivcLivePusher.startPushAysnc("artc://live.aliyun.com/push/123?timestamp=1661596947&token=XXX&userId=userD&sdkAppId=XXX"); // The ingest URL of the co-streamer.
iOSのサンプルコード
AlivcLivePusher *rtcPusher = [[AlivcLivePusher alloc] initWithConfig:rtcPushConfig];
[rtcPusher startPushWithURL:@"artc://live.aliyun.com/push/123?timestamp=1661596947&token=XXX&userId=userD&sdkAppId=XXX"]; // The ingest URL of the co-streamer.
Windowsのサンプルコード
AlivcLivePusher * pusher_ = AlivcLivePusher::Create("");
pusher_->init(config_);
pusher_->setLivePushErrorListener(this);
pusher_->setLivePushInfoListener(this);
pusher_->setLivePushNetworkListener(this);
pusher_->startPush("artc://live.aliyun.com/push/123?timestamp=1661596947&token=XXX&userId=userD&sdkAppId=XXX");
ストリーマAは、コストリーマDのコストリーミングのためのストリーミングURLを取得し、コストリーマDのストリームをリアルタイムでプルするためのAlivcLivePlayerオブジェクトを作成する。
Androidのサンプルコード
AlivcLivePlayConfig config = new AlivcLivePlayConfig();
config.isFullScreen = isAnchor;
AlivcLivePlayer alivcLivePlayer = new AlivcLivePlayerImpl(context, AlivcLiveMode.AlivcLiveInteractiveMode);
alivcLivePlayer.setPlayInfoListener(new AlivcLivePlayInfoListener() {});
mAlivcLivePlayer.setupWithConfig(config);
mAlivcLivePlayer.setPlayView(frameLayout);
alivcLivePlayer.startPlay(artc://live.aliyun.com/play/123?timestamp=1661596947&token=XXX&userId=userD&sdkAppId=XXX"); // The streaming URL for co-streaming of the other side. In this case, the streamer uses the streaming URL of the co-streamer to pull the stream of the co-streamer.
iOSのサンプルコード
AlivcLivePlayer *rtcPlayer = [[AlivcLivePlayer alloc] init];
[rtcPlayer setLivePlayerDelegate:self];
[rtcPlayer setPlayView:self.playerView playCofig:self.rtcPlayConfig];
[rtcPlayer startPlayWithURL:@"artc://live.aliyun.com/play/123?timestamp=1661596947&token=XXX&userId=userD&sdkAppId=XXX"];"]; // The streaming URL for co-streaming of the other side. In this case, the streamer uses the streaming URL of the co-streamer to pull the stream of the co-streamer.
Windowsのサンプルコード
AlivcLivePlayer *player_ = AlivcLivePlayer::Create("");
if (player_) {
AlivcLivePlayConfig config;
player_->setupWithConfig(config);
player_->startPlay("artc://live.aliyun.com/play/123?timestamp=1661596947&token=XXX&userId=userD&sdkAppId=XXX");
player_->setPlayView(hwnd, width, height);
}
同時に、Co-streamer Dは、Streamer Aのコストリーミング用のストリーミングURLを取得し、AlivcLivePlayerオブジェクトを作成して、Streamer Aのストリームをリアルタイムでプルします。
Androidのサンプルコード
AlivcLivePlayConfig config = new AlivcLivePlayConfig();
config.isFullScreen = isAnchor;
AlivcLivePlayer alivcLivePlayer = new AlivcLivePlayerImpl(context, AlivcLiveMode.AlivcLiveInteractiveMode);
alivcLivePlayer.setPlayInfoListener(new AlivcLivePlayInfoListener() {});
mAlivcLivePlayer.setupWithConfig(config);
mAlivcLivePlayer.setPlayView(frameLayout);
alivcLivePlayer.startPlay(artc://live.aliyun.com/play/123?timestamp=1661596947&token=XXX&userId=userA&sdkAppId=XXX"); // The streaming URL for co-streaming of the other side. In this case, the co-streamer uses the streaming URL of the streamer to pull the stream of the streamer.
iOSのサンプルコード
AlivcLivePlayer *rtcPlayer = [[AlivcLivePlayer alloc] init];
[rtcPlayer setLivePlayerDelegate:self];
[rtcPlayer setPlayView:self.playerView playCofig:self.rtcPlayConfig];
[rtcPlayer startPlayWithURL:@"artc://live.aliyun.com/play/123?timestamp=1661596947&token=XXX&userId=userA&sdkAppId=XXX"];"]; // The streaming URL for co-streaming of the other side. In this case, the co-streamer uses the streaming URL of the streamer to pull the stream of the streamer.
Windowsのサンプルコード
AlivcLivePlayer *player_ = AlivcLivePlayer::Create("");
if (player_) {
AlivcLivePlayConfig config;
player_->setupWithConfig(config);
player_->startPlay("artc://live.aliyun.com/play/123?timestamp=1661596947&token=XXX&userId=userA&sdkAppId=XXX");
player_->setPlayView(hwnd, width, height);
}
インタラクティブなコストリーミングは、ストリーマAおよびコストリーマDに対して、超低レイテンシで実装される。
ストリーマAは、コストリーミングが成功した後に混合ストリームを更新します
ビデオストリームの場合:
ビューアBおよびビューアC (コストリーマではない) がコストリーマDのストリームを確実に見ることができるようにするために、ストリーマAはストリームミキシング動作を実行しなければならない。 このようにして、ストリーマAおよびコストリーマDのストリームは、視聴者が再生のためにCDNから引き出すことができる単一のストリームに混合することができる。 具体的には、ストリーマAは、setLiveMixTranscodingConfigメソッドを呼び出して、混合ストリームのトランスコーディングタスクを開始し、混合するストリームを指定します。 混合ストリームの解像度やフレームレートなどのパラメータは、AlivcLivePushConfigでAlivcLivePusherオブジェクトを作成するときにStreamer Aが設定したものです。 たとえば、AlivcLivePusherオブジェクトを作成するときにStreamer AがAlivcLivePushConfigで解像度を720pに設定した場合、混合ストリームの解像度は720pになります。
Androidのサンプルコード
AlivcLiveTranscodingConfig transcodingConfig = new AlivcLiveTranscodingConfig();
AlivcLiveMixStream anchorMixStream = new AlivcLiveMixStream();
anchorMixStream.setUserId(anchorId);
anchorMixStream.setX(0);
anchorMixStream.setY(0);
anchorMixStream.setWidth(mAlivcLivePushConfig.getWidth());
anchorMixStream.setHeight(mAlivcLivePushConfig.getHeight());
anchorMixStream.setZOrder(1);
AlivcLiveMixStream audienceMixStream = new AlivcLiveMixStream();
audienceMixStream.setUserId(audience);
audienceMixStream.setX((int) mAudienceFrameLayout.getX() / 3);
audienceMixStream.setY((int) mAudienceFrameLayout.getY() / 3);
audienceMixStream.setWidth(mAudienceFrameLayout.getWidth() / 2);
audienceMixStream.setHeight(mAudienceFrameLayout.getHeight() / 2);
audienceMixStream.setZOrder(2);
ArrayList<AlivcLiveMixStream> mixStreams = new ArrayList<>();
mixStreams.add(anchorMixStream);
mixStreams.add(audienceMixStream);
transcodingConfig.setMixStreams(mixStreams);
alivcLivePusher.setLiveMixTranscodingConfig(transcodingConfig);
iOSのサンプルコード
AlivcLiveTranscodingConfig *liveTranscodingConfig = [[AlivcLiveTranscodingConfig alloc] init];
AlivcLiveMixStream *anchorMixStream = [[AlivcLiveMixStream alloc] init];
anchorMixStream.userId = userA;
anchorMixStream.x = 0;
anchorMixStream.y = 0;
anchorMixStream.width = [self.rtcPushConfig getPushResolution].width;
anchorMixStream.height = [self.rtcPushConfig getPushResolution].height;
anchorMixStream.zOrder = 1;
AlivcLiveMixStream *audienceMixStream = [[AlivcLiveMixStream alloc] init];
audienceMixStream.userId = userD;
audienceMixStream.x = 100;
audienceMixStream.y = 200;
audienceMixStream.width = 200;
audienceMixStream.height = 300;
audienceMixStream.zOrder = 2;
liveTranscodingConfig.mixStreams = [NSArray arrayWithObjects:anchorMixStream, audienceMixStream, nil];
[self.rtcPusher setLiveMixTranscodingConfig:liveTranscodingConfig];
Windowsのサンプルコード
AlivcLiveTranscodingConfig liveTranscodingConfig;
AlivcLiveMixStream anchorMixStream ;
anchorMixStream.userId = userA;
anchorMixStream.x = 0;
anchorMixStream.y = 0;
anchorMixStream.width = width;
anchorMixStream.height = height;
anchorMixStream.zOrder = 1;
AlivcLiveMixStream audienceMixStream;
audienceMixStream.userId = userD;
audienceMixStream.x = 100;
audienceMixStream.y = 200;
audienceMixStream.width = 200;
audienceMixStream.height = 300;
audienceMixStream.zOrder = 2;
liveTranscodingConfig.mixStreams.Add(anchorMixStream);
liveTranscodingConfig.mixStreams.Add(audienceMixStream);
pusher_->setLiveMixTranscodingConfig(&liveTranscodingConfig);
視聴者は、ストリーマAとコストリーマDの混合ストリームを視聴できます。
オーディオのみのストリームの場合:
ミックスストリームを更新するには、ストリーマーはAlivcLiveMixStreamで共同ストリーマーのユーザーIDを指定するだけです。 位置情報は不要である。
Androidのサンプルコード
AlivcLiveTranscodingConfig transcodingConfig = new AlivcLiveTranscodingConfig();
AlivcLiveMixStream anchorMixStream = new AlivcLiveMixStream();
anchorMixStream.setUserId(anchorId);
AlivcLiveMixStream audienceMixStream = new AlivcLiveMixStream();
audienceMixStream.setUserId(audience);
ArrayList<AlivcLiveMixStream> mixStreams = new ArrayList<>();
mixStreams.add(anchorMixStream);
mixStreams.add(audienceMixStream);
transcodingConfig.setMixStreams(mixStreams);
alivcLivePusher.setLiveMixTranscodingConfig(transcodingConfig);
iOSのサンプルコード
AlivcLiveTranscodingConfig *liveTranscodingConfig = [[AlivcLiveTranscodingConfig alloc] init];
AlivcLiveMixStream *anchorMixStream = [[AlivcLiveMixStream alloc] init];
anchorMixStream.userId = userA;
AlivcLiveMixStream *audienceMixStream = [[AlivcLiveMixStream alloc] init];
audienceMixStream.userId = userD;
liveTranscodingConfig.mixStreams = [NSArray arrayWithObjects:anchorMixStream, audienceMixStream, nil];
[self.rtcPusher setLiveMixTranscodingConfig:liveTranscodingConfig];
Windowsのサンプルコード
AlivcLiveTranscodingConfig liveTranscodingConfig;
AlivcLiveMixStream anchorMixStream;
anchorMixStream.userId = userA;
AlivcLiveMixStream audienceMixStream;
audienceMixStream.userId = userD;
liveTranscodingConfig.mixStreams.Add(anchorMixStream);
liveTranscodingConfig.mixStreams.Add(audienceMixStream);
pusher_->setLiveMixTranscodingConfig(&liveTranscodingConfig);
共同ストリーマーDが共同ストリーミングを終了
コストリーミングを停止するには、co-streamer DがAlivcLivePusherでストリーム取り込みを停止するメソッドを呼び出してから、AlivcLivePusherを破棄する必要があります。
Androidのサンプルコード
alivcLivePusher.stopPush();
alivcLivePusher.destroy();
alivcLivePusher = null;
iOSのサンプルコード
[self.rtcPusher stopPush];
[self.rtcPusher destory];
self.rtcPusher = nil;
Windowsのサンプルコード
if ( pusher_) {
pusher_->stopPush();
AlivcLivePusher::destroy();
pusher_ = nullptr;
}
同時に、Co-streamer DはAlivcLivePlayerで再生を停止するために使用されるメソッドを呼び出し、AlivcLivePlayerを破棄する必要があります。
Androidのサンプルコード
alivcLivePlayer.stopPlay();
alivcLivePlayer.destroy();
alivcLivePlayer = null;
iOSのサンプルコード
[self.rtcPlayer stopPlay];
self.rtcPlayer = nil;
Windowsのサンプルコード
if (player_) {
player_->stopPlay();
player_->destroy();
player_ = nullptr;
}
コストリーマDは通常のビューアになり、CDNからストリームをプルできます。 詳細については、「手順4: CDN再生用のAliPlayerオブジェクトの作成」をご参照ください。
Streamer Aは、AlivcLivePlayerで再生を停止するメソッドを呼び出してから、AlivcLivePlayerを破棄する必要があります。
Androidのサンプルコード
alivcLivePlayer.stopPlay();
alivcLivePlayer.destroy();
alivcLivePlayer = null;
iOSのサンプルコード
[self.rtcPlayer stopPlay];
self.rtcPlayer = nil;
Windowsのサンプルコード
if (player_) {
player_->stopPlay();
player_->destroy();
player_ = nullptr;
}
同時に、Streamer AはsetLiveMixTranscodingConfigメソッドを呼び出し、空の値を渡す必要があります。 このようにして、流れの混合は停止される。
視聴者がStreamer Aのストリームのみを視聴したい場合は常に、Streamer AはsetLiveMixTranscodingConfigメソッドを呼び出し、空の値を渡してストリームミキシングを停止できます。
警告 ストリーマがまだ室内にあるが、ストリームミキシングを必要としない場合は、ストリームミキシングが停止していることを確認してください。 ストリームミキシングが停止されていない場合、実行を継続するストリームミキシングモジュールには不要な料金が発生します。
Androidのサンプルコード
alivcLivePusher.setLiveMixTranscodingConfig(null);
iOSのサンプルコード
[self.rtcPusher setLiveMixTranscodingConfig:nil];
Windowsのサンプルコード
pusher_->setLiveMixTranscodingConfig(nullptr);