天天看點

産品百科 |RTC Windows SDK 手動推流和手動訂閱的實作步驟

音視訊通信 RTC(Real-Time Communication)是阿裡雲覆寫全球的實時音視訊開發平台,依托核心音視訊編解碼、信道傳輸、網絡排程技術,提供高可用、高品質、超低延時的音視訊通信服務,讓使用者快速搭建多端實時應用,适用于線上教育、視訊會議、互動娛樂、音視訊社交等場景。

産品連結:

https://www.aliyun.com/product/rtc 通過閱讀本文,您可以了解手動推流和手動訂閱的實作步驟。

背景資訊

RTC SDK 提供了 setAutoPublish 接口,支援設定自動推流或自動訂閱,設定自動推流時 SDK 會在加入頻道後自動推流,設定自動訂閱時 SDK 會在頻道中有其他使用者推流時自動進行訂閱拉流,無需 App 進行操作。

如果您需要根據具體業務場景,按需進行推流或者拉流,可以使用手動推流或手動訂閱方式。

推流端

  1. 建立引擎執行個體後,在加入頻道前,設定關閉自動推流(設定參數 autoPub 為 false)。
// 建立引擎執行個體
AliRtcEngine *pEngine = AliRtcEngine::sharedInstance(this, "");
// 關閉自動推流/自動訂閱
pEngine->setAutoPublishSubscribe(false, false);      
  1. 配置後加入頻道,并根據業務需要啟動推流(音頻 / 攝像頭 / 螢幕采集),并通過回調确認推流是否成功,如果推流失敗需要進行重試或提示使用者。

    說明 必須在加入頻道成功後才能開始推流,否則推流會失敗,您需要關注加入頻道結果是否成功。

// 配置推送音頻流
pEngine->configLocalAudioPublish(true);
// 配置推送攝像頭流
pEngine->configLocalCameraPublish(true);
// 配置推送螢幕分享流
pEngine->configLocalScreenPublish(true);
// 啟動推流
auto callback = [](void *opaque, int errorCode) {
    if (errorCode == 0) {
        // 推流成功
    } else {
        // 推流失敗
    }
};
pEngine->publish(callback, this);      
  1. 當業務場景需要停止推流時,配置關閉上一步打開的媒體流并執行停止推流。
// 配置停止推送音頻流
pEngine->configLocalAudioPublish(false);
// 配置停止推送攝像頭流
pEngine->configLocalCameraPublish(false);
// 配置停止推送螢幕分享流
pEngine->configLocalScreenPublish(false);
// 停止推流
auto callback = [](void *opaque, int errorCode) {
};
pEngine->publish(callback, this);      

訂閱端

  1. 建立引擎執行個體後,在加入頻道前,設定關閉自動訂閱(設定參數 autoSub 為 false)。
// 建立引擎執行個體
AliRtcEngine *pEngine = AliRtcEngine::sharedInstance(this, "");
// 關閉自動推流/自動訂閱
pEngine->setAutoPublishSubscribe(false, false);      
  1. 配置後并成功加入頻道,當頻道中使用者推流發送變化時,SDK 會回調 onRemoteTrackAvailableNotify 進行通知,回調中指明了推流使用者及推送的媒體流。
    • audioTrack 為 AliRtcAudioTrackMic 時,代表該遠端使用者推送了音頻流。
    • videoTrack 為 AliRtcVideoTrackCamera 或 AliRtcVideoTrackBoth 時,代表該遠端使用者推送了攝像頭視訊流。
    • videoTrack 為 AliRtcVideoTrackScreen 或 AliRtcVideoTrackBoth 時,代表該遠端使用者推送了螢幕分享視訊流。
    • audioTrack 為 AliRtcAudioTrackNo 并且 videoTrack 為 AliRtcVideoTrackNo 時,代表該遠端使用者已停止推流。
// 接收到其他使用者推流變化通知
void onRemoteTrackAvailableNotify(const AliRtc::String &uid,
    AliRtcAudioTrack audioTrack,
    AliRtcVideoTrack videoTrack)
{
    ...
}      
  1. 說明
    • 在加入頻道成功後,才會接收到頻道中其他使用者推流回調 onRemoteTrackAvailableNotify,您需要關注加入頻道結果是否成功。
    • 回調 onRemoteTrackAvailableNotify 中指明了推流使用者 ID,以及該使用者發生狀态變更的媒體流,您需要記錄該使用者已推送媒體流。
  1. 接收到推流回調後,可根據遠端使用者實際推送的媒體流及業務需要,配置訂閱推流使用者的媒體流,然後啟動訂閱。
// 配置訂閱指定使用者音頻流
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);      
    • 在接收到遠端使用者的推流回調之後,您才能對該使用者進行訂閱拉流,否則訂閱失敗。
    • 您需要關注回調中遠端使用者實際推送的媒體流,對于沒有推送的媒體流,訂閱無法成功。
    • 如果遠端使用者狀态已變為停止推流後,您不能對該使用者執行訂閱操作,直到再次接收到該使用者重新開始推送媒體流的回調。
  1. 訂閱成功後,訂閱使用者會接收到回調 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);
    }
}      
  1. 說明 onSubscribeChangedNotify 回調中傳回了實際訂閱遠端使用者媒體流的結果,您需要關注訂閱結果是否與訂閱配置一緻,确認訂閱是否成功。
  2. 當業務場景不需要訂閱指定使用者媒體流,或遠端使用者已停止推流時(參見步驟 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);      
「視訊雲技術」你最值得關注的音視訊技術公衆号,每周推送來自阿裡雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流切磋。
産品百科 |RTC Windows SDK 手動推流和手動訂閱的實作步驟