音視訊通信 RTC(Real-Time Communication)是阿裡雲覆寫全球的實時音視訊開發平台,依托核心音視訊編解碼、信道傳輸、網絡排程技術,提供高可用、高品質、超低延時的音視訊通信服務,讓使用者快速搭建多端實時應用,适用于線上教育、視訊會議、互動娛樂、音視訊社交等場景。
産品連結:
https://www.aliyun.com/product/rtc 通過閱讀本文,您可以了解手動推流和手動訂閱的實作步驟。背景資訊
RTC SDK 提供了 setAutoPublish 接口,支援設定自動推流或自動訂閱,設定自動推流時 SDK 會在加入頻道後自動推流,設定自動訂閱時 SDK 會在頻道中有其他使用者推流時自動進行訂閱拉流,無需 App 進行操作。
如果您需要根據具體業務場景,按需進行推流或者拉流,可以使用手動推流或手動訂閱方式。
推流端
- 建立引擎執行個體後,在加入頻道前,設定關閉自動推流(設定參數 autoPub 為 false)。
// 建立引擎執行個體
AliRtcEngine *pEngine = AliRtcEngine::sharedInstance(this, "");
// 關閉自動推流/自動訂閱
pEngine->setAutoPublishSubscribe(false, false);
-
配置後加入頻道,并根據業務需要啟動推流(音頻 / 攝像頭 / 螢幕采集),并通過回調确認推流是否成功,如果推流失敗需要進行重試或提示使用者。
說明 必須在加入頻道成功後才能開始推流,否則推流會失敗,您需要關注加入頻道結果是否成功。
// 配置推送音頻流
pEngine->configLocalAudioPublish(true);
// 配置推送攝像頭流
pEngine->configLocalCameraPublish(true);
// 配置推送螢幕分享流
pEngine->configLocalScreenPublish(true);
// 啟動推流
auto callback = [](void *opaque, int errorCode) {
if (errorCode == 0) {
// 推流成功
} else {
// 推流失敗
}
};
pEngine->publish(callback, this);
- 當業務場景需要停止推流時,配置關閉上一步打開的媒體流并執行停止推流。
// 配置停止推送音頻流
pEngine->configLocalAudioPublish(false);
// 配置停止推送攝像頭流
pEngine->configLocalCameraPublish(false);
// 配置停止推送螢幕分享流
pEngine->configLocalScreenPublish(false);
// 停止推流
auto callback = [](void *opaque, int errorCode) {
};
pEngine->publish(callback, this);
訂閱端
- 建立引擎執行個體後,在加入頻道前,設定關閉自動訂閱(設定參數 autoSub 為 false)。
// 建立引擎執行個體
AliRtcEngine *pEngine = AliRtcEngine::sharedInstance(this, "");
// 關閉自動推流/自動訂閱
pEngine->setAutoPublishSubscribe(false, false);
- 配置後并成功加入頻道,當頻道中使用者推流發送變化時,SDK 會回調 onRemoteTrackAvailableNotify 進行通知,回調中指明了推流使用者及推送的媒體流。
-
- audioTrack 為 AliRtcAudioTrackMic 時,代表該遠端使用者推送了音頻流。
- videoTrack 為 AliRtcVideoTrackCamera 或 AliRtcVideoTrackBoth 時,代表該遠端使用者推送了攝像頭視訊流。
- videoTrack 為 AliRtcVideoTrackScreen 或 AliRtcVideoTrackBoth 時,代表該遠端使用者推送了螢幕分享視訊流。
- audioTrack 為 AliRtcAudioTrackNo 并且 videoTrack 為 AliRtcVideoTrackNo 時,代表該遠端使用者已停止推流。
// 接收到其他使用者推流變化通知
void onRemoteTrackAvailableNotify(const AliRtc::String &uid,
AliRtcAudioTrack audioTrack,
AliRtcVideoTrack videoTrack)
{
...
}
- 說明
-
- 在加入頻道成功後,才會接收到頻道中其他使用者推流回調 onRemoteTrackAvailableNotify,您需要關注加入頻道結果是否成功。
- 回調 onRemoteTrackAvailableNotify 中指明了推流使用者 ID,以及該使用者發生狀态變更的媒體流,您需要記錄該使用者已推送媒體流。
- 接收到推流回調後,可根據遠端使用者實際推送的媒體流及業務需要,配置訂閱推流使用者的媒體流,然後啟動訂閱。
// 配置訂閱指定使用者音頻流
pEngine->configRemoteAudio(userId, true);
// 配置訂閱指定使用者攝像頭流
pEngine->configRemoteCameraTrack(userId, false, true);
// 配置訂閱指定使用者螢幕分享流
pEngine->configRemoteScreenTrack(userId, true);
// 啟動訂閱
auto callback = [](void *opaque, const AliRtc::String &uid, AliRtcVideoTrack vt, AliRtcAudioTrack at) {
};
pEngine->subscribe(userId, callback, this);
-
- 在接收到遠端使用者的推流回調之後,您才能對該使用者進行訂閱拉流,否則訂閱失敗。
- 您需要關注回調中遠端使用者實際推送的媒體流,對于沒有推送的媒體流,訂閱無法成功。
- 如果遠端使用者狀态已變為停止推流後,您不能對該使用者執行訂閱操作,直到再次接收到該使用者重新開始推送媒體流的回調。
- 訂閱成功後,訂閱使用者會接收到回調 onSubscribeChangedNotify,此時可設定用于顯示視訊流的 View(視圖)。
-
- audioTrack 為 AliRtcAudioTrackMic 時,代表已訂閱遠端使用者推送了音頻流。
- videoTrack 為 AliRtcVideoTrackCamera 或 AliRtcVideoTrackBoth 時,代表已訂閱遠端使用者攝像頭視訊流。
- videoTrack 為 AliRtcVideoTrackScreen 或 AliRtcVideoTrackBoth 時,代表已訂閱遠端使用者推送了螢幕分享視訊流。
void onSubscribeChangedNotify(const AliRtc::String &uid,
AliRtcAudioTrack audioTrack,
AliRtcVideoTrack videoTrack) {
if (at == AliRtcAudioTrackMic) {
// 訂閱音頻流成功
}
if (vt == AliRtcVideoTrackCamera || vt == AliRtcVideoTrackBoth) {
// 訂閱攝像頭流成功
AliVideoCanvas cameraCanvas;
...
pEngine->setRemoteViewConfig(&cameraCanvas, uid, AliRtcVideoTrackCamera);
}
if (vt == AliRtcVideoTrackScreen || vt == AliRtcVideoTrackBoth) {
// 訂閱螢幕流成功
AliVideoCanvas screenCanvas;
...
pEngine->setRemoteViewConfig(&screenCanvas, uid, AliRtcVideoTrackScreen);
}
}
- 說明 onSubscribeChangedNotify 回調中傳回了實際訂閱遠端使用者媒體流的結果,您需要關注訂閱結果是否與訂閱配置一緻,确認訂閱是否成功。
- 當業務場景不需要訂閱指定使用者媒體流,或遠端使用者已停止推流時(參見步驟 2 中遠端停止推流狀态),配置并取消訂閱對應使用者。
// 配置取消訂閱指定使用者音頻流
pEngine->configRemoteAudio(userId, false);
// 配置取消訂閱指定使用者攝像頭流
pEngine->configRemoteCameraTrack(userId, false, false);
// 配置取消訂閱指定使用者螢幕分享流
pEngine->configRemoteScreenTrack(userId, false);
// 取消訂閱
auto callback = [](void *opaque, const AliRtc::String &uid, AliRtcVideoTrack vt, AliRtcAudioTrack at) {
};
pEngine->subscribe(userId, callback, this);
「視訊雲技術」你最值得關注的音視訊技術公衆号,每周推送來自阿裡雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流切磋。
