旁路直播指将正在进行音视频互动的音视频流推流给第三方CDN(Content Delivery Network),支持直接推送源流和推送混合流,用户通过 App 播放器或者 Web 浏览器的方式可观看视频直播。
请确认已实现基本的通话或者直播功能,具体操作参见 实现视频互动。
在推流前,调用 setLiveTranscodingTask 开混流并配置混流参数。
taskId
:任务ID。LiveTranscoding
:混流配置,可配置 混流布局、水印、背景等。调用 addPublishTranscodingStreamUrl 推送混合流至指定 CDN 地址。
如需推送多条流,需多次调用该API,最多推送5条流,推流地址可在推流后动态增删。
(可选)调用 setLiveTranscodingTask 更新混流参数 (LiveTranscoding)。
(可选)调用 removePublishTranscodingStreamUrl 删除指定的一路音视频流。
调用 removeLiveTranscodingTask 并传入 taskId
停掉后台的转码任务。
推流状态改变时,SDK 会触发 onPublishStreamToCDNStatus 回调向主播报告当前推流状态,状态码:
请确保收到该回调后再调用 API 进行下一步操作。如果增加或删除一个推流地址失败,请通过错误码排查问题。
int mixMode = Utils.getPushMixMode();
int height = 0;
int width = 0;
if (mixMode == ThunderRtcConstant.LiveTranscodingMode.TRANSCODING_MODE_640X480) {
height = 480;
width = 640;
} else if (mixMode == ThunderRtcConstant.LiveTranscodingMode.TRANSCODING_MODE_960X544) {
height = 544;
width = 960;
} else if (mixMode == ThunderRtcConstant.LiveTranscodingMode.TRANSCODING_MODE_1280X720) {
height = 720;
width = 1280;
} else if (mixMode == ThunderRtcConstant.LiveTranscodingMode.TRANSCODING_MODE_1920X1080 {
height = 1080;
width = 1920;
}
LiveTranscoding transCoding = new LiveTranscoding();
LiveTranscoding.TranscodingUser localUser = new LiveTranscoding.TranscodingUser();
if (!TextUtils.isEmpty(Constant.mLocalRoomId) && !TextUtils.isEmpty(Constant.mLocalUid)) {
localUser.roomId = Constant.mLocalRoomId;
localUser.uid = Constant.mLocalUid;
localUser.layoutW = Constant.isMixSubscribeRemote ? width / 2 : width;
localUser.layoutH = height;
localUser.layoutX = 0;
localUser.layoutY = 0;
localUser.zOrder = 1;
localUser.bCrop = true;
transCoding.addUser(localUser);
}
if (!TextUtils.isEmpty(Constant.mRemoteRoomId) && !TextUtils.isEmpty(Constant.mRemoteUid)
&& Constant.isMixSubscribeRemote) {
LiveTranscoding.TranscodingUser matchUser = new LiveTranscoding.TranscodingUser();
matchUser.roomId = Constant.mRemoteRoomId;
matchUser.uid = Constant.mRemoteUid;
matchUser.layoutW = width / 2;
matchUser.layoutH = height;
matchUser.layoutX = localUser.layoutW;
matchUser.layoutY = 0;
matchUser.zOrder = 0;
matchUser.bStandard = true;
matchUser.bCrop = true;
transCoding.addUser(matchUser);
}
if (transCoding.getUserCount() <= 0) {
return;
}
transCoding.setTransCodingMode(mixMode);
RoomManager.getInstance(context).setLiveTranscodingTask(Constant.TASK_ID, transCoding);