快速实现直播连麦

更新时间: 2023/10/16 15:40:28

本文介绍在单人直播的过程中,观众连麦场景下,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; 

功能原理

连麦的架构原理如下图所示。

连麦.png

连麦的业务流程说明如下:

  1. 观众申请上麦,主播同意上麦申请后,观众加入 RTC 房间。
  2. 互动直播服务器将主播和观众的音视频进行混屏转码后,推到 CDN 分发。
  3. 观众端使用 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

实现方法

  1. 已实现单人直播

开始连麦

  1. 开启旁路推流任务。

    主播 A 调用 addLiveStreamTask 方法添加旁路推流任务,将主播房间和连麦者的音视频流推送到 CDN 上进行合流。

  2. 等待旁路推流结果。

    通过 onLiveStreamState 回调监听旁路推流状态,如果状态为 STATE_PUSHING, 表示旁路推流成功。如果旁路推流失败,则调用 removeLiveStreamTask 方法移除推流任务。

  3. 旁路推流成功后,停止单人直播推流。

    主播 A 调用 stopPushStreaming 方法停止单人直播推流。

结束连麦

  1. 开始单人直播推流。

    主播 A 调用 startPushStreaming 方法开始单人直播推流。

  2. 等待单人直播推流结果。

    主播 A 通过 onStartPushStreaming 回调监听单人直播推流状态,如果推流成功,则执行下一步操作。

  3. 移除旁路推流任务。

    主播 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);

此文档是否对你有帮助?
有帮助
去反馈
  • 功能原理
  • API 时序图
  • 实现方法
  • 示例代码
  • 常用的回调