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