互动直播 Web 端开发指南

SDK 概述

网易云通信 SDK 为移动提供完善的音视频直播与实时互动开发框架,屏蔽其内部复杂细节,对外提供较为简洁的 API 接口,方便第三方应用快速集成互动直播功能,主要有:

目前web端有两种方式支持互动直播

SDK 兼容性要求:

开发准备

互动直播能力作为网易云通信 IM SDK 的 plugin 与 IM SDK 一起发布,并且依赖 IM SDK 的帐号系统。在接入互动直播时,开发者需要参考 IM 即时通讯开发指南 的 以下几个章节:

互动直播相关概念

互动直播接入

云通信提供简单的互动直播和连麦接口,只需要创建并加入互动房间即可以实现直播推流;连麦者使用相同的房间名加入互动房间即可以实现实时连麦互动。

用创建接口创建一个互动直播房间:

netcall.createChannel({
  channelName: channelName //必填
  custom: custom //可选
  webrtcEnable: webrtcEnable // 是否支持WebRTC方式接入,可选,默认为不开启
}).then(obj => {
  // 创建房间成功后的上层逻辑操作
  // eg: 初始化房间UI显示
  // eg: 加入房间
}).catch(err => {
  // 创建房间失败的处理
})

需要先创建房间,本人和其他人才能加入房间。

会议通过 channelName 字段做标识;可以通过扩展字段 custom 在会议的创建和加入之间传递自定义的额外信息。

如果需要与 WebRTC 客户端互通,需要指定 WebRTC 兼容开关 webrtcEnable 为 true, 该 WebRTC 为 Beta 版,如果没有 WebRTC 客户端参与, 不要打开该开关

同一个房间名称,只在房间使用完以后才可以重复使用,开发者需要保证不会出现重复预订某房间名称而不使用的情况。

WebRTC方式如下:

// 主播加入房间
netcall.joinChannel({
  channelName: this.channelName,
  type: WebRTC.NETCALL_TYPE_VIDEO,
  liveEnable: true, // 开启互动直播,可选 true / false(默认不开启)
  sessionConfig: {
    isHost: true, //是否是主播,
    bypassRtmp: true, //是否开启推流开关
    rtmpRecord: true, //是否开启推流录制开关
    rtmpUrl: '推流地址', // 推流地址, 主播必须设置, 请填写自己申请的推流地址
    splitMode: WebRTC.LAYOUT_SPLITLATTICETILE, //主播和连麦者的布局模式, 主播必须设置
    layout: '自定义布局模式'
  }
}).then(obj => {
  console.log('joinChanel', obj)
}, err => {
  console.log('joinChannelErr', err)
})

// 连麦者加入房间
netcall.joinChannel({
  channelName: this.channelName,
  type: WebRTC.NETCALL_TYPE_VIDEO,
  liveEnable: true, // 开启互动直播,可选 true / false(默认不开启)
  sessionConfig: {
    isHost: false, //非主播,必须设置false,
    bypassRtmp: true, //是否开启推流开关
    rtmpRecord: true //是否开启推流录制开关
  }
}).then(obj => {
  console.log('joinChannel', obj)
}, err => {
  console.log('joinChannelErr', err)
})

PC Agent方式如下:

// 主播加入房间
netcall.joinChannel({
  channelName: this.channelName,
  type: WebRTC.NETCALL_TYPE_VIDEO,
  webrtcEnable: true, // 是否开启WebRTC通话的支持, 对于WebRTC beta版,在有 webrtc 客户端参与的房间中需要打开该开关,如果没有 webrtc 客户端参与,不要打开该开关。
  liveEnable: true,  // 是否开启互动直播,可选 true / false(默认不开启)
  sessionConfig: {
    videoQuality: Netcall.CHAT_VIDEO_QUALITY_480P, // 视频分辨率,实际效果因画面采集频率和机器性能限制可能达不到期望值
    videoFrameRate: Netcall.CHAT_VIDEO_FRAME_RATE_NORMAL, // 视频帧率,实际效果因画面采集频率和机器性能限制可能达不到期望值
    videoBitrate: 100000, // 视频码率, >=100000 <= 5000000 有效
    recordVideo: true, // 视频录制开关, 默认关闭
    recordAudio: true, // 音频录制开关, 默认关闭
    highAudio: false, // 高清语音开关, 默认关闭
    bypassRtmp: true, // 推流开关, 默认关闭,推流相关配置前提开关打开
    rtmpUrl: '推流地址', // 推流地址, 主播必须设置, 请填写自己申请的推流地址
    rtmpRecord: true, // 推流服务端录制开关, 默认关闭
    splitMode: Netcall.LAYOUT_SPLITLATTICETILE // 推流的布局, {@link Netcall.LAYOUT_*|布局类型}默认平铺
  }
}).then(obj => {
  console.log('joinChanel', obj)
}, err => {
  console.log('joinChannelErr', err)
})

// 连麦者加入房间, 备注:连麦者请不要设置推流地址!
netcall.joinChannel({
  channelName: this.channelName,
  type: WebRTC.NETCALL_TYPE_VIDEO,
  liveEnable: true,  // 是否开启互动直播,可选 true / false(默认不开启)
  sessionConfig: {
    videoQuality: Netcall.CHAT_VIDEO_QUALITY_480P, // 视频分辨率,实际效果因画面采集频率和机器性能限制可能达不到期望值
    videoFrameRate: Netcall.CHAT_VIDEO_FRAME_RATE_NORMAL, // 视频帧率,实际效果因画面采集频率和机器性能限制可能达不到期望值
    videoBitrate: 100000, // 视频码率, >=100000 <= 5000000 有效
    recordVideo: true, // 视频录制开关, 默认关闭
    recordAudio: true, // 音频录制开关, 默认关闭
    highAudio: false, // 高清语音开关, 默认关闭
    bypassRtmp: true, // 推流开关, 默认关闭,推流相关配置前提开关打开
    rtmpRecord: true, // 推流服务端录制开关, 默认关闭
    splitMode: Netcall.LAYOUT_SPLITLATTICETILE // 推流的布局, {@link Netcall.LAYOUT_*|布局类型}默认平铺
  }
}).then(obj => {
  console.log('joinChannel', obj)
}, err => {
  console.log('joinChannelErr', err)
})

主播可以调用如下接口,实时切换推流地址,实现某些视频流平台的防盗链功能。

netcall.updateRtmpUrl(url)
// 有人加入多人房间
netcall.on('joinChannel', obj => {
    // 通知上层有其他用户加入了房间。
})
// 有人离开多人房间
netcall.on('leaveChannel', obj => {
    // 通知上层有其他用户离开了房间。
})

音视频设备

提供麦克风、扬声器(听筒)、摄像头等设备的遍历、启动关闭、监听的接口

遍历设备

在启动设备前可以遍历设备获取本地设备列表用以选择性的开启音视频设备

netcall.getDevicesOfType(WebRTC.DEVICE_TYPE_VIDEO).then((devices) => {
    console.log('视频设备列表', devices)
})

netcall.getDevicesOfType(WebRTC.DEVICE_TYPE_AUDIO_IN).then((devices) => {
    console.log('音频设备列表', devices)
})

启动设备

可以启动麦克风、摄像头、本地采集音频播放器、对方语音播放器等,device填空的时候会启动系统首选项

netcall.startDevice({
    type: WebRTC.DEVICE_TYPE_VIDEO, // 开启类型:音频、视频
    device: deviceId // 设备id,选填(默认设备列表的第一项)
}).then(()=>{
    // todo
}).catch(()=>{
    // todo
})

结束设备

netcall.stopDevice({
    type: WebRTC.DEVICE_TYPE_VIDEO // 结束类型:音频、视频
})

监听设备状态

通过设置设备监听,可以定时获知设备状态

netcall.on('deviceStatus', obj => {
    console.log('on deviceStatus', obj)
})

由于开启设备监听后会定时检查设备状态,在不需要时结束监听

监听音频数据(音量)

netcall.on('audioVolume', obj => {
    console.log('on audioVolume', obj)
})

设置音量采集大小

实时设置己方音频采集大小, 0-255

netcall.setCaptureVolume(100)

设置音量播放大小

设置对方音量播放大小, 0-255 多人房间需要传入目标account或者uid

netcall.setPlayVolume({
  account: 'testaccount'
  volume: 100
})

API 文档