快速实现直播连麦
更新时间: 2024/08/23 14:52:55
本文介绍在单人直播的过程中,观众连麦场景下,NERTC 的实现流程。
flowchart LR
A("创建应用并获取 App Key") --> B(开通音视频通话 2.0 和直播服务)--> E("获取推拉流地址")--> C("集成 RTC SDK") --> D(实现直播连麦)
click A "https://doc.yunxin.163.com/console/docs/TIzMDE4NTA?platform=console"
click B "https://doc.yunxin.163.com/live-streaming/docs/DM4MjYxODY?platform=android"
click C "https://doc.yunxin.163.com/nertc/docs/DcyNDc0ODI?platform=android"
click E "https://doc.yunxin.163.com/live-streaming/docs/DM4MjYxODY?platform=android#步骤3-获取推拉流地址"
style D fill:#337EFF,stroke:#337EFF,stroke-width:0px,color:#FFFFFF;
style A fill:#9DC3E6,stroke:#9DC3E6,stroke-width:0px,color:#FFFFFF;
style B fill:#9DC3E6,stroke:#9DC3E6,stroke-width:0px,color:#FFFFFF;
style C fill:#9DC3E6,stroke:#9DC3E6,stroke-width:0px,color:#FFFFFF;
style E fill:#9DC3E6,stroke:#9DC3E6,stroke-width:0px,color:#FFFFFF;
功能原理
连麦的架构原理如下图所示。
连麦的业务流程说明如下:
- 观众申请上麦,主播同意上麦申请后,观众加入 RTC 房间。
- 互动直播服务器将主播和观众的音视频进行混屏转码后,推到 CDN 分发。
- 观众端使用 RTMP/HLS/FLV 协议进行拉流观看。
API 时序图
sequenceDiagram
actor 主播A
participant NERtcSDK
participant 业务服务器
actor 连麦者
Note over 主播A, 连麦者: 开始连麦
连麦者->>业务服务器: 申请上麦
Note right of 主播A: 请自行实现相关业务逻辑
业务服务器->>主播A: 申请上麦
主播A-->>业务服务器: 同意上麦
业务服务器-->>连麦者: 主播同意上麦
连麦者 ->> NERtcSDK: joinChannel
rect rgb(191, 223, 255)
主播A ->> NERtcSDK: addLiveStreamTask 开始旁路推流
NERtcSDK -->> 主播A: onLiveStreamState
主播A ->> NERtcSDK: stopPushStreaming 旁路推流成功后,停止推流
Note over 主播A, 连麦者: 连麦状态下新增连麦
主播A ->> NERtcSDK: updateLiveStreamTask 更新旁路推流
Note over 主播A, 连麦者: 结束连麦
连麦者 ->> 业务服务器: 下麦
业务服务器 ->> 主播A: 下麦
主播A ->> NERtcSDK: startPushStreaming 重新开始推流
NERtcSDK -->> 主播A: onStartPushStreaming
主播A ->> NERtcSDK: removeLiveStreamTask 移除推流任务
end
连麦者 ->> NERtcSDK: leaveChannel
实现方法
开始连麦
-
开启旁路推流任务。
主播 A 调用
addLiveStreamTask
方法添加旁路推流任务,将主播房间和连麦者的音视频流推送到 CDN 上进行合流。 -
等待旁路推流结果。
通过
onLiveStreamState
回调监听旁路推流状态,如果状态为STATE_PUSHING
, 表示旁路推流成功。如果旁路推流失败,则调用removeLiveStreamTask
方法移除推流任务。 -
旁路推流成功后,停止单人直播推流。
主播 A 调用
stopPushStreaming
方法停止单人直播推流。
结束连麦
-
开始单人直播推流。
主播 A 调用
startPushStreaming
方法开始单人直播推流。 -
等待单人直播推流结果。
主播 A 通过
onStartPushStreaming
回调监听单人直播推流状态,如果推流成功,则执行下一步操作。 -
移除旁路推流任务。
主播 A 和 主播 B 分别调用
removeLiveStreamTask
方法移除旁路推流任务。
示例代码
网易云信为您提供实现CDN 推流的示例代码作为参考,您可以直接拷贝用于运行测试。
请单击下载CDN 推流最佳实践代码。
public void enterSeat() {
//step1 开启旁路推流任务(addLiveStream)
NERtcEx.getInstance().addLiveStreamTask(taskInfo, (taskId, errCode) -> {});
//step2 等待旁路推流结果(onLiveStreamState), 如果state为STATE_PUSHING表示添加旁路任务成功,否则停止cdn推流(stopPushStreaming)
}
public void leaveSeat() {
//step1 开始cdn推流(startPushStreaming)
NERtcEx.getInstance().startPushStreaming(pushStreamingConfig);
//step2 等待cdn推流结果回调(onStartPushStreaming)
//成功后移除旁路推流任务(removeLiveStreamTask)
//NERtcEx.getInstance().removeLiveStreamTask(taskId, (DeleteLiveTaskCallback) (taskId, errCode) -> {});
}
常用的回调
请在初始化时注册推流相关的回调,连麦场景需要关注的主要回调如下:
//开始推流startPushStreaming结果回调
void onStartPushStreaming(int result, long channelId);
//停止推流stopPushStreaming结果回调
void onStopPushStreaming(int result);
//推流过程中断开,变为重连状态回调
void onPushStreamingReconnecting(int reason);
//推流过程中重连成功回调
void onPushStreamingReconnectedSuccess();
//推流状态已改变回调
void onLiveStreamState(String taskId, String pushUrl, int liveState);
此文档是否对你有帮助?