文档反馈
文档反馈

实现互动直播(Flutter)

重要通知

网易云信新版文档中心现已正式上线!

音视频通话2.0互动直播2.0多人语音聊天室PK 直播等产品和场景方案已迁移至新版文档中心维护,欢迎体验!

网易云信互动直播产品的基本功能包括音视频通话和连麦直播,当您成功初始化 SDK 之后,您可以简单体验本产品的基本业务流程,例如主播加入房间、观众 CDN 拉流、连麦者上下麦、结束直播等。本文档为您展示互动直播提供的基本业务流程。

前提条件

请确认您已完成以下操作:

快速跑通 Sample Code

注意:在运行示例项目之前,请联系商务经理开通非安全模式。非安全模式建议只在集成开发阶段使用,请在应用正式上线前改回安全模式。

  1. SDK和示例代码下载页面或 Demo 体验页面下载需要体验的示例项目或 Demo 源码工程。
  2. example/lib/Config.dart 文件中配置 AppKey。

     class Config {
     //替换为你自己的AppKey
     static const String APP_KEY = '';
     }
  3. 运行工程。

主播加入房间

1. 导入类

在您的工程中对应的 Page 文件里添加如下代码先导入以下重要类:

  import 'package:nertc/nertc.dart';

2. 初始化

默认情况下,请先执行 create 方法完成初始化。

// 示例
  void _initRtcEngine() async {
      NERtcOptions options = NERtcOptions(
        audioAutoSubscribe: _settings.autoSubscribeAudio,
        serverRecordSpeaker: _settings.serverRecordSpeaker,
        serverRecordAudio: _settings.serverRecordAudio,
        serverRecordVideo: _settings.serverRecordVideo,
        serverRecordMode:
            NERtcServerRecordMode.values[_settings.serverRecordMode],
        videoSendMode: NERtcVideoSendMode.values[_settings.videoSendMode],
        videoEncodeMode:
            NERtcMediaCodecMode.values[_settings.videoEncodeMediaCodecMode],
        videoDecodeMode:
            NERtcMediaCodecMode.values[_settings.videoDecodeMediaCodecMode]);
    _engine
        .create(
            appKey: Config.APP_KEY,
            channelEventCallback: this,
            options: options);
   }

3. 设置本地视图(可选)

初始化成功后,可以设置设置本地视图,来预览本地图像。您可以在加入房间之前预览,或在加入房间后预览。

4. 设置直播模式

在互动直播的场景中,建议在加入房间前,通过 setChannelProfile 接口设置房间模式为直播模式。当前默认为通信模式。

// 示例
// 0 - communication(通信模式),  1 - liveBroadcasting(直播模式)
_engine.setChannelProfile(1);

5. 设置推流开关

为了将多媒体流推往 CDN,还需要在初始化前设置推流开关,这样拉流的观众可以拉取到该用户对应的音视频流。

通过 NERtcOptionspublishSelfStream 设置推流开关。

// 示例
void _initRtcEngine() async {
    NERtcOptions options = NERtcOptions(publishSelfStream: true);
_engine.create(
        appKey: Config.APP_KEY,
        channelEventCallback: this,
        options: options);
}

6. 加入房间

加入房间前,请确保已完成初始化相关事项。若您的业务中涉及呼叫邀请等机制,建议通过信令实现。

通过 joinChannel 方法加入房间。

// 示例
_engine.joinChannel(token,channelName,uid);

参数说明

参数 说明
token 安全认证签名(NERTC Token)。可设置为:
  • null。非安全模式下可设置为 null。安全性不高,建议在产品正式上线前联系对应商务经理转为安全模式。
  • 已获取的NERTC Token。安全模式下必须设置为获取到的 Token 。若未传入正确的 Token 将无法进入房间。

    推荐使用安全模式。

channelName 房间名称,设置相同房间名称的用户会进入同一个通话房间。
注意:您也可以在加入通道前,通过创建房间接口创建房间。加入房间时,若传入的 {channelName} 未事先创建,则云信服务器内部将为其自动创建一个名为 {channelName} 的通话房间。
uid 用户的唯一标识 id,房间内每个用户的 uid 必须是唯一的。

SDK发起加入房间请求后,服务器会进行响应,开发者可以通过 NERtcChannelEventCallbackonJoinChannel 回调监听加入房间的结果,同时该回调会抛出当前通话房间的 channelId 与加入房间总耗时(毫秒)。

注意:请在创建 NERtcEngine 方法 create 中传入原型为 NERtcChannelEventCallbackcallback

7. 推流任务管理

在成功加入房间后,需要设置推流任务来将通话房间内的多媒体数据推至 CDN。典型的业务场景里是由主播进行设置推流任务。推流任务也可以通过 服务端API 进行管理,请根据您的业务需求选择合适的方式。

注意

增加推流任务

音视频房间中默认没有推流任务,您需要在启动直播前通过 addLiveStreamTask 方法增加推流任务。

// 示例
// 初始化推流任务
NERtcLiveStreamTaskInfo liveTask = new NERtcLiveStreamTaskInfo();
//taskID 可选字母、数字,下划线,不超过64位
liveTask.taskId = 'TASKID';
// 设置推互动直播推流地址,一个推流任务对应一个推流房间
liveTask.url = 'pushUlr';
// 设置是否进行互动直播录制,请注意与音视频通话录制区分。
liveTask.serverRecordEnabled = false;
// 设置推音视频流还是纯音频流
liveTask.liveMode = enableVideo? NERtcLiveStreamMode.liveStreamModeVideo : NERtcLiveStreamMode.liveStreamModeAudio;

//设置整体布局
NERtcLiveStreamLayout layout = new NERtcLiveStreamLayout();
layout.userTranscodingList = List();
layout.width = 720;//整体布局宽度
layout.height = 1280;//整体布局高度
layout.backgroundColor = Colors.black;// 整体背景色
liveTask.layout = layout;

    // 设置直播成员布局
NERtcLiveStreamUserTranscoding user1 = new NERtcLiveStreamUserTranscoding(uid: uid1);
user1.audioPush = true; // 推流是否发布user1 的音频
user1.videoPush = enableVideo; // 推流是否发布user1的视频
if (user1.videoPush) {// 如果发布视频,需要设置一下视频布局参数
  // user1 视频的缩放模式, 详情参考NERtcLiveStreamUserTranscoding 的API 文档
  user1.adaption = NERtcLiveStreamVideoScaleMode.liveStreamModeVideoScaleCropFill;
  user1.x = 10; // user1 的视频布局x偏移,相对整体布局的左上角
  user1.y = 10; // user1 的视频布局y偏移,相对整体布局的左上角
  user1.width = 180; // user1 的视频布局宽度
  user1.height = 320; //user1 的视频布局高度
}

layout.userTranscodingList.add(user1);

// 调用 addLiveStreamTask 接口添加推流任务
_engine.addLiveStreamTask(liveTask, (String taskId, int errCode) {
// 添加推流任务结果
} );

更新推流任务

当音视频通话房间内有人员进出或其他情况时,可以使用 updateLiveStreamTask 方法更新推流任务。更新推流任务时,会覆盖之前对于这条推流任务的所有配置。

// 示例
// 初始化新推流任务。注意:其中的taskid为原推流任务id。
NERtcLiveStreamTaskInfo updateLiveTask1 = preLiveTask;
...
// 更新推流任务
_engine.updateLiveStreamTask(updateLiveTask1 , (String taskId, int errCode) {
// 更新推流任务结果
});

删除推流任务

当本场互动直播准备结束时,可以通过 removeLiveStreamTask 方法主动删除推流任务。

// 示例
_engine.removeLiveStreamTask(preLiveTask.taskId, (String taskId, int errCode) {
// 删除推流任务结果
} );

推流任务相关错误码

增加、更新与删除推流任务时,如果发生错误,callback 回调通过错误码形式反馈错误原因。错误码 NERtcLiveStreamErrorCode 如下:

错误码 含义
OK = 0 成功
requestIsInvaild = 1301 task请求无效,被后续操作覆盖
invaild = 1400 task参数格式错误
roomExited = 1401 已经退出房间
numLimit = 1402 推流任务超出上限
duplicateId = 1403 推流ID重复
notFound = 1404 taskId任务不存在,或房间不存在
requestError = 1417 请求失败
internalServerErr = 1500 服务器内部错误
invalidLayout = 1501 布局参数错误
userPictureError = 1502 用户图片错误

互动直播推流状态

主播或连麦者参与互动直播的过程中,可以通过 NERtcChannelEventCallbackonLiveStreamState 来监听推流状态。

常见的推流状态如下:

状态码 含义
NERtcLiveStreamState.pushing = 505 推流中
NERtcLiveStreamState.pushFail = 506 互动直播推流失败
NERtcLiveStreamState.pushStopped = 511 推流结束
NERtcLiveStreamState.imageError = 512 背景图片设置出错

8. 设置远端视图

互动直播过程中,除了要显示本地的视频画面,通常也要显示参与互动的其他连麦者/主播的远端视频画面。

  1. NERtcChannelEventCallback 通过以下回调获取相关信息:

    • onUserJoined :监听远端用户加入通话房间的事件,并抛出对方的 uid。当本端加入房间后,也会通过此回调抛出通话房间内已有的其他用户。

    • onUserVideoStart :监听远端用户发布视频流的事件,回调中携带对方的 uid 与发布的视频分辨率。

  2. 在监听到远端用户加入房间或发布视频流后,本方可以通过 attachToRemoteVideo 方法设置远端用户视频画布,用于显示其视频画面。

     // 示例
     NERtcVideoRenderer renderer =
         await VideoRendererFactory.createVideoRenderer();
     renderer.attachToRemoteVideo(uid);
  3. 在监听到远端用户发布视频流后,本方可以通过 subscribeRemoteVideo 方法对其发起视频流的订阅,来将对方的视频流渲染到视频画布上。

    _engine.subscribeRemoteVideo(uid, profile, subscribe);

9. 音频流

本地音频的采集发布和远端音频订阅播放是默认启动的,正常情况下无需开发者主动干预。

观众进行 CDN 拉流

当通话房间内有主播/连麦者发布多媒体流,且正确设置了推流任务时,通话房间外的观众可以通过 CDN 直播拉流地址进行拉流播放。云信同时提供播放器 SDK 供您使用,详细内容请参考 直播 - 播放器SDK

连麦者上下麦

1. 上麦

若正在进行 CDN 拉流播放的普通观众要上麦参与互动时,必须先停止 CDN 拉流,并释放播放器相关资源。然后按照主播加入房间流程,进行初始化、设置本地视图、设置直播模式、设置推流开关、加入通话房间、设置远端视图。

注意

2. 下麦

若连麦者互动结束,需要下麦时,可以更新推流任务,在推流布局中剔除该连麦者。同时,连麦者退出通话房间,清理相关资源,重新进行播放器拉流或直接离开直播间。

通话房间内的其他用户可以通过 NERtcChannelEventCallbackonUserLeave 来监听其他连麦者下麦。

结束互动直播

需要结束该场互动直播时,可以先删除推流任务,然后主播与连麦者退出通话房间,观众结束CDN拉流。

1. 退出通话房间

通过 leaveChannel() 接口退出通话房间。

// 示例
// 退出通话房间
_engine.leaveChannel();

NERtcChannelEventCallback 提供 onLeaveChannel 来监听当前用户退出房间的结果。

2. 销毁实例

当确定 App 短期内不再使用音视频通话实例时,可以通过 release() 接口释放对应的对象资源。

// 示例
// 销毁实例
_engine.release();
×

反馈成功

非常感谢您的反馈,我们会继续努力做得更好。