快速实现直播连麦

更新时间: 2023/10/16 08:06:14

本文介绍在单人直播的过程中,观众连麦场景下,NERTC 的实现流程。

功能原理

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

连麦.png

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

  1. 观众申请上麦,主播同意上麦申请后,观众加入 RTC 房间。
  2. 互动直播服务器将主播和观众的音视频进行混屏转码后,推到 CDN 分发。
  3. 观众端使用 RTMP/HLS/FLV 协议进行拉流观看。

注意事项

  • 只支持网易云信播放器 NELivePlayer 进行拉流,其他播放器暂不兼容。
  • 单人直播切换到 PK 直播时,音频采样率必须保持一致。

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: onNERTCEngineLiveStreamState
   
    主播A ->> NERtcSDK: stopPushStreaming   旁路推流成功后,停止推流

    Note over 主播A, 连麦者:连麦状态下新增连麦
    主播A ->> NERtcSDK: updateLiveStreamTask  更新旁路推流

    Note over 主播A, 连麦者:结束连麦
    连麦者 ->> 业务服务器: 下麦
    业务服务器 ->> 主播A: 下麦

 
    主播A ->> NERtcSDK: startPushStreaming  重新开始推流
    NERtcSDK -->> 主播A: onNERtcEngineStartPushStreamingWithResult:channelId:

    主播A ->> NERtcSDK: removeLiveStreamTask 移除推流任务
    end

    连麦者 ->> NERtcSDK: leaveChannel

实现方法

  1. 已实现单人直播

开始连麦

  1. 开启旁路推流任务。

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

  2. 等待旁路推流结果。

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

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

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

结束连麦

  1. 开始单人直播推流。

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

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

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

  3. 移除旁路推流任务。

    主播 A 和 主播 B 分别调用 removeLiveStreamTask 方法移除旁路推流任务。

示例代码

//开始接受连麦
- (int)enterSeat {
    //step1:添加旁路推流任务 ,旁路任务中的音频参数保持跟cdn下相同(采样率、声道数等等)
    [[NERtcEngine sharedEngine] addLiveStreamTask:task compeltion:^(NSString * _Nonnull taskId, kNERtcLiveStreamError errorCode) {
    }];
    //step2 等待旁路推流结果(onNERTCEngineLiveStreamState:taskID:url:), 如果state为kNERtcLsStatePushing表示添加旁路任务成功,则停止cdn推流(stopPushStreaming)
    [[NERtcEngine sharedEngine] stopPushStreaming];
}

//结束接受连麦
- (int)leaveSeat {
    //step1 开始cdn推流
    [[NERtcEngine sharedEngine] startPushStreaming:config];
    //step2 等待cdn推流结果回调(onNERtcEngineStartPushStreamingWithResult:channelId:),成功后移除旁路推流任务(removeLiveStreamTask:compeltion:)
    [[NERtcEngine sharedEngine] removeLiveStreamTask:task compeltion:^(NSString * _Nonnull taskId, kNERtcLiveStreamError errorCode) {
    }];
}

常用的回调

请在初始化时注册推流相关的回调,连麦场景需要关注的主要回调如下:

//开始推流startPushStreaming结果回调
- (void)onNERtcEngineStartPushStreamingWithResult:(NERtcError)result channelId:(uint64_t)channelId;

//停止推流stopPushStreaming结果回调
- (void)onNERtcEngineStopPushStreaming:(NERtcError)result;

//推流过程中断开,变为重连状态回调
- (void)onNERtcEnginePushStreamingChangeToReconnectingWithReason:(NERtcError)reason;

//推流过程中重连成功回调
- (void)onNERtcEnginePushStreamingReconnectedSuccess;

//推流状态已改变回调
- (void)onNERTCEngineLiveStreamState:(NERtcLiveStreamStateCode)state taskID:(NSString *)taskID url:(NSString *)url;

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