快速实现 CDN 推流

更新时间: 2024/04/01 10:53:23

NERTC SDK 融合了 CDN 推流能力,您只要集成一个 SDK 即可实现单人直播、PK 直播和连麦,且三个场景之间能无缝切换,提升 PK 直播体验。


  flowchart LR

    
    A("创建应用并获取 App Key") --> B(开通音视频通话 2.0 和直播服务)-->  E("获取推拉流地址")--> C("集成 RTC SDK") --> D(实现 CDN 推流)
    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; 

功能描述

  • 在单人直播时,SDK 将主播的音视频直接推流到 CDN 分发,观众端无需加入 RTC 房间即可通过播放器拉流观看。
  • 在 PK 直播时,通过跨频道转发,主播无须切换 SDK,也不需要退出或重新进入房间,直接将媒体流转发到主播房间和挑战者房间,实现主播跨房间与其他主播实时互动。直播间内的观众可以同时观看两个主播 PK 互动,场景无缝切换,不会出现黑屏卡顿问题。
  • 只有指定版本的 NERTC SDK 支持 CDN 推流功能。请在 SDK 下载中心直播推流区域下载对应的 SDK。
  • 为了保障您的直播体验,接入之前,请联系网易云信技术支持根据您的场景为您提供专属的 1 对 1 服务。

应用场景

该功能适用于直播间PK、游戏、在线教育等场景。

  • 秀场直播:PK 连麦是视频互动直播的主流玩法,多个主播间通过主动邀请、随机匹配等方式互相配对,连麦成功后通过斗歌等方式进行 PK 竞技,并在一定时限内决出胜负,获胜一方可获得奖励,例如粉丝礼物、打赏、积分等。
  • 游戏场景:用户可以选择与其他玩家进行 PK,通过 PK 功能实现双方的音视频流同步播放,提高游戏体验。
  • 电商直播:可通过引入 PK 连麦模式,实现价格比拼等直播形式,激起用户的购买欲望,摆脱传统电商直播缺少互动的单调形式。
  • 在线教育:老师和学生可以通过 PK 功能进行互动课堂,实现音视频流的同步播放,提高学习效果。

前提条件

功能原理

单人直播的架构原理如下图所示。

单人直播.png

单人直播模式下,NERTC SDK 将主播音视频直接推流到 CDN 分发,观众端使用 RTMP/HLS/FLV 协议进行拉流观看。

注意事项

  • 只支持网易云信播放器 NELivePlayer 进行拉流,其他播放器暂不兼容。
  • 单人直播切换到 PK 直播时,音频采样率必须保持一致。
  • 旁路推流时请使用客户端的推流接口(addLiveStreamTask),不要使用服务端的旁路推流接口,因为客户端推流接口针对本场景做了适配处理。

步骤1:集成 RTC SDK

只有指定版本的 NERTC SDK 支持 CDN 推流功能,请参考如下方法集成对应版本的 NERTC SDK。详细的集成 SDK 的步骤请参见集成 SDK

使用 Maven 集成的示例代码如下:

bashimplementation 'com.netease.yunxin:nertc:4.6.426'

如需手动集成,请到 SDK 下载中心直播推流区域下载最新版本的 RTC SDK。

步骤2:导入类

在您的工程中对应实现音视频通话的 Activity 文件里添加如下代码先导入以下重要类:

javaimport com.netease.lava.nertc.sdk.NERtcCallbackEx;
import com.netease.lava.nertc.sdk.NERtcConstants;
import com.netease.lava.nertc.sdk.NERtcEx;
import com.netease.lava.nertc.sdk.NERtcParameters;
import com.netease.lava.nertc.sdk.video.NERtcRemoteVideoStreamType;
import com.netease.lava.nertc.sdk.video.NERtcVideoView;

步骤3:实现单人直播

API 时序图

sequenceDiagram
    actor 主播A
    participant NERtcSDK

    
    主播A->>NERtcSDK: init 初始化引擎
  
    主播A->>NERtcSDK: enableLocalVideo(true) 开启视频的采集和发送
    主播A->>NERtcSDK: enableLocalAudio(true)

    主播A->>NERtcSDK: setAudioProfile 设置音频属性

    主播A->>NERtcSDK: setLocalVideoConfig  设置视频属性

    主播A->>NERtcSDK: setChannelProfile 设置场景属性为直播

    rect rgb(191, 223, 255)
    主播A->>NERtcSDK: startPushStreaming 开始推流
    NERtcSDK-->>主播A: onStartPushStreaming

    主播A->>NERtcSDK: stopPushStreaming 停止推流
    NERtcSDK-->>主播A: onStopPushStreaming
    end

实现方法

  1. 初始化引擎。

    调用 init 方法完成初始化。

    您还需要在初始化时注册相关必要回调,建议您请在初始化方法中传入原型为 NERtcCallbackEx 的回调,并增加相应必要的处理。直播推流相关回调请参见常用的回调

  2. 设置本地视频画布。 初始化成功后,可以设置本地视图,来预览本地图像。您可以根据业务需要实现加入房间之前预览或加入房间后预览。

    • 若您想设置画布渲染参数,可以调用 setScalingType 方法设置渲染缩放模式或调用 setMirror 方法设置镜像模式。
    • 若您想调整摄像头的相关参数,请参考视频设备管理进行设置。
    • 在加入房间前,默认预览分辨率为 640*480,您可以通过 setLocalVideoConfig 接口的 width height 参数调整采集分辨率。
    • 实现加入房间前预览。
    1. 调用 setupLocalVideoCanvasstartVideoPreview(streamType) 方法,在加入房间前设置本地视图,预览本地图像。

    2. 若要结束预览,或者准备加入房间时,调用 stopVideoPreview(streamType) 方法停止预览。

      stopVideoPreview(streamType)streamType 参数请与 startVideoPreview(streamType) 的保持一致,即同为主流或辅流的开启和停止预览。

  3. 调用 enableLocalVideo(streamType)enableLocalAudio方法进行视频和音频的采集发送。

  4. 开始直播前,调用 setChannelProfile 接口,设置房间的场景属性为直播场景(kNERtcChannelProfileLiveBroadcasting)。

  5. 直播前或直播中,调用 setAudioProfilesetLocalVideoConfig 接口,分别设置音频属性和视频属性。 本场景中相关参数的推荐配置如下表所示。

属性
推荐配置
推荐原因

音频属性
setAudioProfile

  • Profile:kNERtcAudioProfileHighQuality 或 kNERtcAudioProfileHighQualityStereo(双声道,伴音场景可以选择该模式)
  • Scenario:kNERtcAudioScenarioMusic

高清音质。满足娱乐场景中主播对高音质的需求。

视频属性
setLocalVideoConfig

以整体画布比例为 16:9 为例:

  • 分辨率:1280 x 720
  • 帧率:15 fps

    或者
  • 分辨率: 960 x 540
  • 帧率:15 fps
    或者
  • 分辨率: 640 x 360
  • 帧率:24 fps

保证画质清晰度。

  1. 主播调用 startPushStreaming 接口,将房间中的音视频流推流到 CDN 上,NERtcPushStreamingConfig 相关参数说明如下表所示。

    参数 描述
    streamingUrl 指定该音视频流的 CDN 推流地址。推流地址的获取方法请参见获取推拉流地址
    NERtcStreamingRoomInfo 推流的房间信息。
  2. 推流成功后,房间内的用户会收到 onStartPushStreaming 的回调。

  3. 直播结束后,调用 stopPushStreaming 接口停止推流。

  4. 停止推流后,房间内的用户会收到 onStopPushStreaming 回调。

示例代码

网易云信为您提供实现CDN 推流的示例代码作为参考,您可以直接拷贝用于运行测试。

请单击下载CDN 推流最佳实践代码

实现单人直播主流程的示例代码如下:

public int startLive(NERtcPushStreamingConfig config) {
    //step1 基础设置

    //初始化引擎(具体初始化方法参见初始化接口init相关)
    NERtcEx.getInstance().init(context, appkey, callback, option);

    ////打开音视频
    NERtcEx.getInstance().enableLocalVideo(true);
    NERtcEx.getInstance().enableLocalAudio(true);

    //以下设置为了保证直播效果,建议开启
    //建议audioprofile设置为kNERtcAudioProfileHighQuality和kNERtcAudioScenarioMusic
    NERtcEx.getInstance().setAudioProfile(NERtcConstants.AudioProfile.HIGH_QUALITY, NERtcConstants.AudioScenario.MUSIC);

    //建议设置为直播模式
    NERtcEx.getInstance().setChannelProfile(NERtcConstants.RTCChannelProfile.LIVE_BROADCASTING);
    //其他设置

    //step2 调用开始推流接口
    //(如果接口未返回错误, 监听onStartPushStreaming回调处理推流结果;如果接口报错,直接处理相关错误)
    return NERtcEx.getInstance().startPushStreaming(config);
}

实现加入房间前预览的示例代码如下:

java//以开启本地视频主流预览为例
NERtcVideoView localView = (NERtcVideoView)findViewById(R.id.render_view_local);
NERtcEx.getInstance().setupLocalVideoCanvas(localView);
NERtcEx.getInstance().startVideoPreview(kNERtcVideoStreamTypeMain);

//设置本地视频画面的渲染模式:以保证原始视频尺寸比例为例(可选)
NERtcEx.getInstance().setScalingType(NERtcConstants.VideoScalingType.SCALE_ASPECT_FIT);

//设置本地视频画面的镜像模式:以开启镜像为例(可选)
NERtcEx.getInstance().setMirror(true);

实现加入房间后预览的示例代码如下:

java//设置本地预览画布
NERtcVideoView localView = (NERtcVideoView)findViewById(R.id.render_view_local);
NERtcEx.getInstance().setupLocalVideoCanvas(localView);

//以开启本地视频主流采集并发送为例
NERtcEx.getInstance().enableLocalVideo(true,kNERtcVideoStreamTypeMain);

//设置本地视频画面的渲染模式:以保证原始视频尺寸比例为例(可选)
NERtcEx.getInstance().setScalingType(NERtcConstants.VideoScalingType.SCALE_ASPECT_FIT);

//设置本地视频画面的镜像模式:以开启镜像为例(可选)
NERtcEx.getInstance().setMirror(true);

常用的回调

请在初始化时注册推流相关的回调,以下列举推流需要关注的主要回调:

  • 单人直播场景需要关注的主要回调如下:
    //开始推流startPushStreaming结果回调
    void onStartPushStreaming(int result, long channelId);
    
    //停止推流stopPushStreaming结果回调
    void onStopPushStreaming(int result);
    
    //推流过程中断开,变为重连状态回调
    void onPushStreamingReconnecting(int reason);
    
    //推流过程中重连成功回调
    void onPushStreamingReconnectedSuccess();
    
    //推流过程重连失败,最终断开回调
    void onDisconnect(int reason);
    
    
  • PK 场景需要关注的主要回调如下:
    //开始推流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);
    
    //跨房间媒体流转发状态发生改变回调
    void onMediaRelayStatesChange(int state, String channelName);
    
    //媒体流相关转发事件回调
    void onMediaRelayReceiveEvent(int event, int code, String channelName);
    
    
  • 连麦场景需要关注的主要回调如下:
    //开始推流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);
    
    

步骤4:播放器拉流

请使用网易云信播放器进行拉流播放,播放器的实现方法请参见实现播放功能

为了避免在播放音视频媒体流时,因网络连接不稳定或者其他问题导致播放失败,请设置自动重试参数,以提高播放成功率和用户体验。

此文档是否对你有帮助?
有帮助
去反馈
  • 功能描述
  • 应用场景
  • 前提条件
  • 功能原理
  • 注意事项
  • 步骤1:集成 RTC SDK
  • 步骤2:导入类
  • 步骤3:实现单人直播
  • API 时序图
  • 实现方法
  • 示例代码
  • 常用的回调
  • 步骤4:播放器拉流