前提
通過 anyRTC音視頻SDK插件 基本實現 uniapp 視頻通話
如若沒有實現基本視頻通話可參考 10分鍾實現一個簡易unapp視頻通話
旁路推流步驟
1. 開通對應權限
前往 anyRTC 控制台 - 用量統計 選擇對應項目開啟旁路推流服務
2. 模式調整
-
場景調整
sdk默認通信場景,需要將通信模式轉為直播模式// 設置直播模式 rtcModule.setChannelProfile({ "profile": 1 }, (res) => { console.log(res); }
-
角色調整
角色-主播: 可以發布和接收音視頻流
角色-觀眾: 只可以接收音視頻流// 1 設置為主播 2 設置為觀眾 rtcModule.setClientRole({ "role": 1 }, (res) => { console.log(res); })
3. 設置推流視圖布局以及音頻設置
-
下載uniapp 插件市場的anyRTC音視頻SDK插件示例
-
引入
utils/classes.js
中的LiveTranscoding
,TranscodingUser
import { LiveTranscoding, TranscodingUser } from "./classes.js"
LiveTranscoding:封裝的總布局
TranscodingUser:封裝的主播布局 -
設置推流的視圖布局及音頻設置
頻道繼續新增主播並且也要合並推流時,重新調用設置即可
// 單個主播布局
// const anchor = new TranscodingUser(主播標識uid, {
// width: 280,
// height: 210,
// x: 0,
// y: 0
// })
// 多個主播布局(3列)
let anchorList= [];
lists.map((item,index)=> {
anchorList.push(new TranscodingUser(主播標識uid, {
width: 280,
height: 210,
x: (index % 3) * 280,
y: Math.floor(index / 3) * 210,
}))
}
// 設置旁路推流(3列)
rtcModule.setLiveTranscoding({
"transcoding": new LiveTranscoding(anchorList, {
width: 840,
height: Math.ceil(anchorList.length / 3) * 210,
})
}, (ret) => {
console.log(ret);
});
4. 推流
需要推多路流時請遍歷推流
rtcModule.addPublishStreamUrl({
url: 推流的cdn地址,
transcodingEnabled: true // 轉碼是指在旁路推流時對音視頻流做一些轉碼處理后再推送到其他 RTMP 服務器
}, (res) => {
console.log("添加旁路推流", res);
});
通過 onRtmpStreamingStateChanged
回調來判斷推流狀態
把回調加入到 setCallBack
中,通過下方時相關狀態碼:
// 狀態碼
state: {
0: "推流未開始或已結束",
1: "正在連接 AR 推流服務器和 RTMP 服務器",
2: "推流正在進行,成功推流后",
3: "正在恢復推流",
4: "推流失敗"
},
// 錯誤碼
errorCode: {
0: "推流成功",
1: "參數無效,請檢查輸入參數是否正確。請確保調用 setLiveTranscoding ",
2: "推流已加密,不能推流",
3: "推流超時未成功,可重新推流",
4: "推流服務器出現錯誤",
5: "RTMP 服務器出現錯誤",
6: "推流請求過於頻繁",
7: "單個主播的推流地址數目達到上線 10",
8: "主播操作不屬於自己的流,請檢查 App 邏輯",
9: "服務器未找到這個流",
10: "推流地址格式有錯誤,請檢查推流地址格式是否正確",
}
5. 停止推流
rtcModule.removePublishStreamUrl({
url: 推流的cdn地址,
}, (res) => {
console.log("取消旁路推流", res);
});