qiniuLive

来自于:开发者立即使用

推流

连麦

拉流(播放端)

监听(播放器、推流)

概述

七牛云服务:

七牛在视频直播大爆发时代,推出专为直播平台打造的全球化直播流服务和端到端直播场景解决方案,完美解决视频企业的三高之痛:技术门槛高、成本高、卡顿延时率高。

七牛优势:

从推流到播放的一站式解决

七牛自建实时流网络(LiveNet),采用智能调度等技术,满足直播特有的网络需求;数据监控平台实现质量透明,帮助用户完成运营闭环;深耕场景丰富性与开放性,全面降低直播平台开发的技术门槛。

1.全球化的实时流网络

采用全新网络技术,实时计算全链路状态,按需智能伸缩最佳路径节点。实现秒开、低延迟不卡顿,和节点故障常态处理等直播需求

2.端到端,场景化 SDK

提供多平台采集 SDK 和播放 SDK,并开放云端 API 实现透明播控管理,助力企业开发者快速构建直播平台的核心业务,提高开发效率。

3.智能化质量监控

基于单个直播流业务粒度的线路质量智能监控及实时动态的数据统计,提供自动容错及全方位的数据分析,定位并优化直播卡顿率。

七牛产品功能:

实时、连接、互动

实时录制、实时水印、实时截图、实时转码、实时鉴⻩、连麦互动、秒级禁播、延时直播 美颜滤镜

七牛使用场景:

满足「直播+」各种行业的使用场景

在 Live 时代下,直播真正的机会在于做「直播+」,即直播跟其他各种领域和垂直行业的结合。七牛直播云,能够更快速、更灵活、更开放的满足不同行业、场景的客户对直播功能的需求,并广泛应用于活动,监控,游戏,电台,教学,VR,社交,无人机等众多行业领域。如:

  • 社交直播
  • 游戏直播
  • 摄像头直播
  • 在线教学直播
  • 现场活动直播
  • 网络电台直播
  • VR 直播
  • 无人机场景直播

七牛客户案例:

PANDA TV、懂足球、大神TV等

模块简述:

qiniuLive 封装了七牛直播云服务平台的移动端开放 SDK。该模块包括视频流采集和视频流播放两部分:

1,推流

开发者可通过调用 setStreamingProfile 接口打开一个的视频采集器(相当于 open 一个 frame),将摄像头收集到的视频推流到服务器端,注意这里需要开发者自己搭建业务服务器,可参考七牛直播入门指南。开发者可通过配置相应参数来自定义视频采集预览器样式、视频质量、美颜等功能。亦可以通过toggleCamera、startStream、stopStream、destroyStream 接口来控制视频采集器,实现停止、开始、切换前后摄像头等功能。

2,拉流

拉流就是指将服务器端的直播视频流下载到本地同时播放,开发者可通过 initPMediaPlayer 接口打开一个可自定义位置和大小的视频播放区域(相当于 open 一个 frame)。然后通过start、stop、pause、resume、接口实现开始、停止、暂停、播放等操作。本模块封装提供了一个打开悬浮窗口的接口,APICloud 平台的开发者可通过调用此接口打开一个悬浮的拉流视频播放器,可随用户手指滑动而移动,效果炫酷。

使用本模块之前需先到七牛官网申请开发者账号,并在账号内创建 app, 操作流程请参考 七牛云服务介绍。

注意:

1, iOS平台,云编译的时候需要勾选相机和麦克风权限,并且最低版本是iOS8.0以上

2, 在iOS 平台上若要支持后台播放(声音)功能,请在 config.xml 文件内配置相关参数,申请后台运行权限,如下:

        <preference name="backgroundMode" value="audio"/>

网络异常处理

直播中,网络异常的情况比我们能意料到的可能会多不少,常见的情况一般有:

1,网络环境切换,比如 3G/4G 与 Wi-Fi 环境切换;

2,网络不可达,网络断开;

3,带宽不足,可能触发缓存速度跟不上播放速度;

作为开发者我们不能乐观的认为只要是 Wi-Fi 网就是好的,因为即便是 Wi-Fi 也有可能因为运营商下行限制,共享网络带宽等因素导致以上网络异常情况的出现。

为何在直播中要面对这么多的网络异常情况,而在其他上传/下载中很少遇到的,这是因为直播对实时性的要求使得它不得不面对这一情况,即无论网络是否抖动,是否能一直良好,直播都要尽可能是可持续,可观看的状态。

对于网络环境的切换,通常需要 App 整体做出调整,不单单是针对直播,所以七牛直播的 SDK 并未对这一情况做额外的监听,而是需要开发者自己对这些状态做出处理。之所以不处理,主要因素是考虑到 App 的业务逻辑场景多样而复杂,对于直播重连的次数、时机、间隔都会有不同的需求,而此时应该让开发者自己来决定是否重连,以及尝试重连的次数。

网络异常处理方案

当因为网络异常而触发了播放断开时,可通过 addEventListener 接口(name 为status时)监听。开发者可以在这个方法内通过重新调用 start 接口来尝试重连。此处建议不要立即重连,而是采用重连间隔加倍的方式,比如共尝试 3 次重连,第一次等待 0.5s, 第二次等待 1s, 第三次等待 2s,这样的方式主要考虑到弱网时网络带宽的缓解需要时间,而加倍重连可以更容易在网络恢复的时候连接,而非在网络已经拥塞时还不断做无用功的重连。

连麦的流程:连麦在业务上存在三种角色,“主播”,“副主播”,“普通观众”,不同的角色,业务流程是不一样的。

1,主播(推流+连麦+合流) 主播是负责推流和合流的角色,数据来自自身的采集和连麦的副主播,其工作流程如下: 打开本地摄像头预览 -> 初始化推流参数( initStreamingEnv + setStreamingProfile ) -> 开始推流[主播画面](startStream)-> -> -> 收到连麦申请(业务服务器) -> 同意连麦申请(业务服务器) -> 开始连麦-> 持续推流[合成画面](configConference + startConference)-> -> -> 结束连麦(stopConference)-> 持续推流[主播画面]-> -> -> 结束推流(stopStream)

2,副主播/连麦观众(连麦) 副主播是连麦后跟主播视频对讲的角色,其工作流程如下: 打开本地摄像头预览(initStreamingEnv + setStreamingProfile) -> 向主播申请连麦(业务服务器) -> “得到同意”(业务服务器) -> 开始连麦(startStream + startConference)-> -> -> 结束连麦(stopConference)

3,普通观众(播放) 观众是观看者角色,从流媒体分发网络拉取主播推送的音视频码流,其工作流程如下: 播放主播画面(initPMediaPlayer) -> -> -> 退出播放器(stop、release)

注意:主播与副主播 useId 不能一样,否则会被挤出房间

initStreamingEnv

初始化直播流的运行环境,不调用该方法将导致推流对象无法初始化

initStreamingEnv(callback(ret))

callback

ret:

  • 类型:JSON 对象
  • 描述:返回值
{
      status: true         //布尔类型;是否初始化成功
}

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.initStreamingEnv(function(ret){
    alert(JSON.stringify(ret));
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

requestStreamJson

请求直播流信息 JSON 字符串,

建议使用 setStreamingProfile 接口的 pushUrl 参数替代此接口,

可从业务服务器获取推流地址。

注意:

若调用本接口,则 setStreamingProfile 接口的 pushUrl 参数可不传。

requestStreamJson({params}, callback(ret, err))

params

requestUrl:

  • 类型:字符串
  • 描述:请求url

callback

ret:

  • 类型:JSON 对象
  • 描述:返回值
{
    streamJson : '' // 字符串类型;返回直播流的信息
}

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.requestStreamJson({
    requestUrl : 'http://xxx.xxx.com'
}, function(ret){
    alert(JSON.stringify(ret));
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

setStreamingProfile

配置直播流参数,初始化推流预览区域

setStreamingProfile({params},callback(ret,err))

params

rect:

  • 类型:JSON 对象
  • 描述:(可选项)推流画面的位置及尺寸
  • 内部字段:
{
    x: 0,      //(可选项)数字类型;模块左上角的 x 坐标(相对于所属的 Window 或 Frame);默认值:0
    y: 0,      //(可选项)数字类型;模块左上角的 y 坐标(相对于所属的 Window 或 Frame);默认值:0
    w: 300,    //(可选项)数字类型;模块的宽度;所属的 Window 或 Frame 的宽度;
    h: 400.    //(可选项)数字类型;模块的高度;所属的 Window 或 Frame 的高度;
}

remoteWindowRect:

  • 类型:JSON 数组
  • 描述:(可选项)连麦时弹出小窗口的位置及尺寸(如果不使用连麦功能可忽略此参数),连麦窗口接通顺序与本数组一一自动对应。
  • 内部字段:
[{
    x: 0,         //(可选项)数字类型;连麦小窗口的左上角的 x 坐标(相对于本接口打开的预览窗口);默认值:0
    y: 0,         //(可选项)数字类型;连麦小窗口的左上角的 y 坐标(相对于本接口打开的预览窗口);默认值:0
    w: 120,       //(可选项)数字类型;连麦小窗口的的宽度;120;
    h: 160        //(可选项)数字类型;连麦小窗口的的高度;160;
}]

pushUrl:

  • 类型:字符串
  • 描述:(可选项)推流地址(若未调用requestStreamJson接口,此参数必填)

videoCapture:

  • 类型:JSON对象
  • 描述:(可选项)视频采集相关参数
  • 内部字段:
{
      videoFrameRate: 30,                   //(可选项)数字类型;采集的视频数据的帧率,默认为 30
      sessionPreset:  '640*480',            //(可选项)字符类型;采集的视频的Preset,默认为'640*480',取值范围:'640*480','1280*720','1920x1080'
      previewMirrorFrontFacing: true ,      //(可选项) 布尔类型;前置预览是否开启镜像,默认为 true
      previewMirrorRearFacing: false,       //(可选项) 布尔类型;后置预览是否开启镜像,默认为 false
      streamMirrorFrontFacing:  false,      //(可选项) 布尔类型;前置摄像头,推的流是否开启镜像,默认 false
      streamMirrorRearFacing: false,        //(可选项) 布尔类型;后置摄像头,推的流是否开启镜像,默认 false
      videoOrientation: 'portrait',         //(可选项) 字符类型;采集摄像头的旋转方向,默认'portrait', 取值范围:'portrait','right','left','upsideDown'
      cameraPosition: 'front'              //(可选项) 字符类型;摄像头的位置,默认'front', 取值范围:'front','back'
}

previewSetting:

  • 类型:JSON对象
  • 描述:相机预览设置(该参数只适用于Android)
  • 内部字段:
{
    previewSizeLevel: 'small',    // 字符类型;相机预览大小等级
                                  // 取值范围:small, medium, large
    previewSizeRatio: 'ratio_4_3' // 字符类型;相机预览大小比例
                                  // 取值范围:ratio_4_3, ratio_16_9
}

videoEncodeHeight:

  • 类型:字符串
  • 描述:视频编码高度(该参数只适用于Android)
  • 取值范围:
    • '1088'
    • '720'
    • '544'
    • '480'
    • '240'

videoStream:

  • 类型:JSON对象
  • 描述:(可选项)视频流相关参数
  • 内部字段:
{
    videoSize:{                 //(可选项) JSON对象;编码分辨率
        width:320 ,              //数字类型;宽度;默认:320
        height:480               //数字类型;高度;默认:480
    },
    videoQuality: 'medium1'     //(可选项)字符串类型;编码质量;默认:medium1
                                //取值范围:
                                //low1:具体参数 videoSize: 272x480, expectedSourceVideoFrameRate: 24, videoMaxKeyframeInterval: 72, profile level: AVVideoProfileLevelH264BaselineAutoLevel, video bitrate: 128Kbps
                                //low2:具体参数 videoSize: 272x480, expectedSourceVideoFrameRate: 24, videoMaxKeyframeInterval: 72, profile level: AVVideoProfileLevelH264BaselineAutoLevel, video bitrate: 256Kbps。
                                //low3:具体参数 videoSize: 272x480, expectedSourceVideoFrameRate: 24, videoMaxKeyframeInterval: 72, profile level: AVVideoProfileLevelH264HighAutoLevel, video bitrate: 512Kbps
                                //medium1:具体参数 videoSize: 368x640, expectedSourceVideoFrameRate: 24, videoMaxKeyframeInterval: 72, profile level: AVVideoProfileLevelH264HighAutoLevel, video bitrate: 512Kbps
                                //medium2:具体参数 videoSize: 368x640, expectedSourceVideoFrameRate: 24, videoMaxKeyframeInterval: 72, profile level: AVVideoProfileLevelH264BaselineAutoLevel, video bitrate: 768Kbps
                                //medium3:具体参数 videoSize: 368x640, expectedSourceVideoFrameRate: 24, videoMaxKeyframeInterval: 72, profile level: AVVideoProfileLevelH264BaselineAutoLevel, video bitrate: 1Mbps
                                //high1:具体参数 videoSize: 720x1280, expectedSourceVideoFrameRate: 24, videoMaxKeyframeInterval: 72, profile level: AVVideoProfileLevelH264BaselineAutoLevel, video bitrate: 1Mbps
                                //high2:具体参数 videoSize: 720x1280, expectedSourceVideoFrameRate: 24, videoMaxKeyframeInterval: 72, profile level: AVVideoProfileLevelH264BaselineAutoLevel, video bitrate: 1.25Mbps
                                //high3:具体参数 videoSize: 720x1280, expectedSourceVideoFrameRate: 24, videoMaxKeyframeInterval: 72, profile level: AVVideoProfileLevelH264BaselineAutoLevel, video bitrate: 1.5Mbps            
}

audioQuality:

  • 类型:字符串
  • 描述:(可选项)音频质量
  • 默认:medium
  • 取值范围:
    • high:具体参数 audio bitrate: 128Kbps
    • medium:具体参数 audio bitrate: 96Kbps
    • low:具体参数 audio bitrate: 64Kbps

face:

  • 类型:JSON 对象
  • 描述:(可选项)美颜相关参数
  • 内部字段:
{
    beautify:false         //(可选项)布尔类型;是否开启美颜模式;默认:false
    setBeautify:0         //(可选项)数字类型;设置美颜程度,范围是从0 ~ 1,0为不美颜(如果美颜不开启,该参数无效);默认:0
    setWhiten:0           //(可选项)数字类型;设置美白程度,范围是从0 ~ 1,0为不美白(如果美颜不开启,该参数无效);默认:0
    setRedden: 0          //(可选项)数字类型;设置红润程度,范围是从0 ~ 1,0为不红润(如果美颜不开启,该参数无效);默认:0
}

continuousFocus:

  • 类型:布尔类
  • 描述:(可选项)是否持续对焦
  • 默认:false

fixedOn:

  • 类型:字符串
  • 描述:(可选项)模块添加到指定 frame 的名字(只指 frame,传 window 无效)
  • 默认:模块依附于当前 window

fixed:

  • 类型:布尔
  • 描述:(可选项)模块是否随所属 window 或 frame 滚动
  • 默认值:true(不随之滚动)

callback

ret:

  • 类型:JSON对象
  • 描述:返回值
{
    status: true       //布尔类型;预览界面是否打开成功
}

示例代码

qiniuLive = api.require('qiniuLive');
qiniuLive.setStreamingProfile({
      rect:{
         x: 0,
         y: 0,
         w: 375,
         h: 667
      },
      videoCapture:{
          videoFrameRate: 30,
          sessionPreset:  '640*480',
          previewMirrorFrontFacing: true ,
          previewMirrorRearFacing: false,
          streamMirrorFrontFacing:  false,
          streamMirrorRearFacing: false,
          videoOrientation: 'portrait',
          cameraPosition: 'front'
      },
      videoStream:{
          videoSize:{
              width:320,
              height:480
          },
          videoQuality: 'medium1'
      },
      face: {
          beautify: false,
          setBeautify:0,
          setWhiten:0,
          setRedden:0
      },
      audioQuality: 'medium',
      continuousFocus: false,
      fixed: true
},function(ret) {
      alert(JSON.stringify(ret));
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

toggleCamera

切换前后摄像头

toggleCamera()

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.toggleCamera();

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

startStream

开始推流,当播放异常时亦可通过此接口发起重链请求,刷新视频播放器

startStream(callback(ret))

callback

ret:

  • 类型:JSON对象
  • 描述:返回值
{
    status:true     //布尔类型;是否推流成功
}

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.startStream(function(ret){
    alert(JSON.stringify(ret));
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

stopStream

结束推流

stopStream(callback(ret))

callback

ret:

  • 类型:JSON对象
  • 描述:返回值
{
    status:true     //是否结束推流
}

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.stopStream(function(ret){
    alert(JSON.stringify(ret));
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

destroyStream

销毁推流,释放资源

destroyStream()

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.destroyStream();

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

configConference

配置连麦

configConference({params}, callback(ret))

params

videoEncodingSizeRatio:

  • 类型:字符串
  • 描述:视频编码比例,暂仅支持 android 平台
  • 取值范围:
    • ratio16_9
    • ratio4_3

videoEncodingSize:

  • 类型:数字类型
  • 描述:视频编码高度分辨率,暂仅支持 android 平台
  • 取值范围:
    • 240
    • 480
    • 544
    • 720
    • 1088

videoBitrateRange:

  • 类型:JSON对象
  • 描述:比特率范围设置
  • 内部字段
{
    from : 100 * 1000,
    to   : 300 * 1000
}

fps:

  • 类型:数字
  • 描述:(可选项)帧率,暂仅支持 android 平台
  • 默认:20

mixOverlayRectArray:

  • 类型:数组
  • 描述:使用精确坐标位置来配置该窗口在合流画面中的位置和大小,该位置是指连麦的窗口在推出来流的画面中的位置,并非在本地预览的位置。需要在连麦开始前设置好,连麦过程中更新无效。
  • 注意:本参数单位同视频分辨率,不同于 setStreamingProfile 接口内的 rect 参数。如:108108 的连麦窗口放在 7201280 和放在 368*640 的效果是不一样的。在 Android 平台可以用 mixOverlayRatios 配置窗口的位置和大小。
  • 内部字段
[{
    x: 0,   //数字类型;在合流主窗口的 x 轴方向上的位置(相对于setStreamingProfile 接口打开的预览窗口)
    y: 0,   //数字类型;在合流主窗口的 y 轴方向上的位置(相对于setStreamingProfile 接口打开的预览窗口)
    w: 100, //数字类型;合流窗口的宽度;默认:100
    h: 100  //数字类型;合流窗口的高度;默认:100
}]

mixOverlayRatios:

  • 类型:数组
  • 描述:使用相对值来配置该窗口在合流画面中的位置和大小,主窗口的原点坐标在左上角
  • 注意:该参数不能与mixOverlayRectArray同时使用,只能使用两者中之一。本参暂仅支持 Android 平台
  • 内部字段:
[{
    x: 0.5,   // x 相对于合流主窗口的 x 方向的位置比例,取值范围:0.0 ~ 1.0
    y: 0.3,   // y 相对于合流主窗口的 y 方向的位置比例,取值范围:0.0 ~ 1.0
    w: 0.5,   // w 相对于合流主窗口的宽的比例,取值范围:0.0 ~ 1.0
    h: 0.5    // h 相对于合流主窗口的高的比例,取值范围:0.0 ~ 1.0
}]

rejoinTimes:

  • 类型:数字
  • 描述:(可选项)断线后自动重新加入房间的重试次数
  • 默认:3

connetTimeout:

  • 类型:数字
  • 描述:(可选项)连接的超时时间,最小为 3000 ms,单位是 ms;默认:5000 ms
  • 默认:5000

callback

ret:

  • 类型:JSON对象
  • 描述:返回值
{
    status:true      // 布尔类型;配置是否成功
}

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.configConference({
   videoEncodingSizeRatio :'ratio16_9',
   videoEncodingSize : 480,
   videoBitrateRange:{
    from : 100 * 1000,
    to   : 300 * 1000
   },
   fps:20,
   mixOverlayRectArray: [{
        x: 0,
        y: 0,
        w: 108,
        h: 192
   }],
   rejoinTimes: 3,
   connetTimeout: 5000
},function(ret) {
   alert(JSON.stringify(ret));
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

startConference

开始连麦。可通过 addRtcStateDidChangeListener、addRtcDidFailListener、addRoomOIListener 得到连麦的状态

startConference({params})

params

userId:

  • 类型:字符串
  • 描述:连麦的的用户 ID,需要保证在同一房间的不同用户 ID 是不同的

roomName:

  • 类型:字符串
  • 描述:连麦的房间名

roomToken:

  • 类型:字符串
  • 描述:连麦房间的 roomToken

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.startConference({
  userId:'',
  roomName:'',
  roomToken:''
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

stopConference

停止连麦,结束连麦后,会停止推送本地音视频流,同时停止拉取房间中的音视频流。可通过 addRtcStateDidChangeListener、addRtcDidFailListener、addRoomOIListener 得到连麦的状态

stopConference({params}, callback(ret))

callback

ret:

  • 类型:JSON对象
  • 描述:返回值
{
    status : true // 布尔类型;表示操作是否失败
}

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.stopConference(function(ret) {
   alert(JSON.stringify(ret));
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

kickoutUser

踢出指定 userID 的用户,只有主播才有踢人的权限。

kickoutUser({params}, callback(ret))

params

userId:

  • 类型:字符串
  • 描述: userID 的用户

callback

ret:

  • 类型:JSON对象
  • 描述:返回值
{
    status : true // 布尔类型;
}

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.kickoutUser({
  userId:''
},function(ret) {
   alert(JSON.stringify(ret));
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

mute

设置静音模式,推流的静音模式

mute({params})

params

isMute:

  • 类型:布尔类型
  • 描述:是否静音

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.mute({isMute:true});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

addRtcStateDidChangeListener

连麦状态已变更的回调

addRtcStateDidChangeListener(callback(ret))

callback

ret:

  • 类型:JSON对象
  • 描述:状态
{                
    state: 'started'    // 字符串类型;连麦状态,连麦状态改变时触发本回调事件,取值范围如下:
                        // unknown 代表: 未知状态,只会作为 init 时的初始状态
                        // started 代表: 已进入到连麦的状态
                        // stopped 代表: 连麦已结束的状态
}

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.addRtcStateDidChangeListener(function(ret) {
     api.alert({msg:JSON.stringify(ret)});
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

addRtcDidFailListener

连麦产生了某个 error 的回调

addRtcDidFailListener(callback(ret))

callback

ret:

  • 类型:JSON对象
  • 描述:状态
{                
    code: '-1'      // 数字类型;错误码,
                    // 在 iOS 平台上取值范围如下:PLStreamErrorUnknow =                       -1:未知错误
                     -999:推流未知配置
                    -1000:DNS 无法访问
                    -1001:socket 连接失败
                    -1002:sockket negotiation 失败
                    -1003:创建 socket 失败
                    -1004:握手失败
                    -1005:rtmp 连接失败
                    -1006:发送数据包失败
                    -1007:被服务端关闭
                    -1008: NetStream 失败
                    -1009: NetStreamPlay 失败
                    -1010: NetStreamPlay 为找到对应的流
                    -1011:连接到无效的 rtmp 应用
                    -1012:Sanity 失败
                    -1013:Socket 被关闭
                    -1014: rtmp 连接流失败
                    -1015:socket 超时
                    -1200:TLS 连接失败
                    -1201:没有 SSL 或者 TLS 支持
                    -1300:DNS 解析失败
                    -1400:PLStreamErrorReconnectFailed
                    -1500:正在采集的时候被音频事件打断但重启失败
                    -1501:正在采集的时候音频服务重启尝试重连但是没有成功
                    -3000:PLRTCStreamingErrorUnknown
                    -3001:PLRTCStreamingErrorStillRunning
                    -3002:PLRTCStreamingErrorInvalidParameter
                    -3003:PLRTCStreamingErrorInitEngineFailed
                    -3004:PLRTCStreamingErrorRoomAuthFailed
                    -3005:PLRTCStreamingErrorJoinRoomFailed
                    -3006:PLRTCStreamingErrorOpenMicrophoneFailed
                    -3007:PLRTCStreamingErrorSubscribeFailed
                    -3008:PLRTCStreamingErrorPublishCameraFailed
                    -3009:PLRTCStreamingErrorConnectRoomFailed
                    -3010:PLRTCStreamingErrorSetVideoBitrateFailed
                    -3011:PLRTCStreamingErrorSystemVersionNotSupported
                    -3012:PLRTCStreamingErrorRTCLibraryNotFound
                    // 在 android 平台上常见错误码可参考七牛官网:https://developer.qiniu.com/pili/sdk/1638/PLDroidRTCStreaming#8 
}

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.addRtcDidFailListener(function(ret) {
     api.alert({msg:JSON.stringify(ret)});
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

addRoomOIListener

进出房间事件监听

addRoomOIListener(callback(ret))

callback(ret)

ret:

  • 类型:JSON 对象
  • 描述:进出房间监听回调参数
  • 内部字段:
{
      eventType:'didDetach',  //字符串类型;监听到的事件类型,取值范围如下:
                              //didDetach:连麦时,取消对方视频渲染的回调
                              //对方视频窗口的位置在 setStreamingProfile 接口的 remoteWindowRect 设定,
                              //与 configConference 接口的参数 mixOverlayRectArray 设置的位置没有关系。
                              //didAttach:连麦时,将对方视频窗口渲染到当前窗口的回调
                              //didKickout:被 userID 从房间踢出的回调
                              //didJoin:userID 加入房间的回调
                              //didLeave:userID 离开房间的回调
      userID: ''              //字符串类型;产生事件的用户 ID
}

示例代码

//监听 talkback 按钮
var qiniuLive = api.require('qiniuLive');
qiniuLive.addRoomOIListener(function(ret) {
     api.alert({msg:JSON.stringify(ret)});
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

resetRemoteWindowRect

重设渲染到制定窗口上的连麦小窗口的位置和大小

resetRemoteWindowRect({params}, callback(ret))

params

userId:

  • 类型:字符串
  • 描述:要重设的连麦小窗口的用户 ID

rect:

  • 类型: JSON 对象
  • 描述:重设的rect信息
  • 内部字段:
{
    x: 0,         //(可选项)数字类型;连麦小窗口的左上角的 x 坐标(相对于所属的 Window 或 Frame);默认值:0
    y: 0,         //(可选项)数字类型;连麦小窗口的左上角的 y 坐标(相对于所属的 Window 或 Frame);默认值:0
    w: 120,       //(可选项)数字类型;连麦小窗口的的宽度;默认:100;
    h: 160        //(可选项)数字类型;连麦小窗口的的高度;默认:100;
}

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.resetRemoteWindowRect({
  userId:'',
  rect: {
        x: 100,
        y: 0,
        w: 100,
        h: 100
  }
},function(ret) {
   alert(JSON.stringify(ret));
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

switchView

切换预览窗口和指定(通过userId)的连麦窗口的位置和大小

switchView()

userId:

  • 类型:字符串
  • 描述:连麦小窗口的用户 ID

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.switchView({
   userId: ''
});

可用性

iOS系统,Android系统

可提供的1.0.5及更高版本

getRtcViewUserIds

获取当前所有连麦小窗口的userID

getRtcViewUserIds(callback(ret))

ret:

  • 类型:JSON对象
  • 描述:返回结果
  • 内部字段:
{
      userIds:[]   //数组类型;返回的当前所有连麦窗口的userID组成的数组,其排列顺序同 setStreamingProfile 接口内 remoteWindowRect 参数设置的位置一一对应,依次排列。若某一位置上无窗口则对于本数组的位置为空,如:['123','','124']对应的连麦窗口是 A, ,B;['123','124']对应的连麦窗口是 A,B
}

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.getRtcViewUserIds(function(ret){
    var userIDary = ret.userIds;
});

可用性

iOS系统,Android系统

可提供的1.0.5及更高版本

initPMediaPlayer

初始化视频播放器(拉流,直播观看端)

initPMediaPlayer({params}, callback(ret, err))

params

rect:

  • 类型:JSON 对象
  • 描述:(可选项)播放器的位置及尺寸
  • 内部字段:
{
    x: 0,   //(可选项)数字类型;模块左上角的 x 坐标(相对于所属的 Window 或 Frame);默认值:0
    y: 0,   //(可选项)数字类型;模块左上角的 y 坐标(相对于所属的 Window 或 Frame);默认值:0
    w: 80,  //(可选项)数字类型;模块的宽度;若传'auto',页面从x位置开始自动充满所属的 Window 或 Frame 的宽度;默认:'auto'
    h: 50   //(可选项)数字类型;模块的高度;若传'auto',页面从y位置开始自动充满所属的 Window 或 Frame 的高度;默认:'auto'
}

dataUrl:

  • 类型: 字符串
  • 描述:媒体源(支持: 本地文件绝对路径,或 HLS URL,或 RTMP URL)

codec:

  • 类型: 数字
  • 描述:(可选项)解码方式
  • 默认:0
  • 取值范围:
    • 0 :软解
    • 1 :硬解

prepareTimeout:

  • 类型:数字
  • 描述:(可选项)准备超时时间(单位:ms)
  • 默认:10 * 1000

readTimeout:

  • 类型:数字
  • 描述:(可选项)读取视频帧超时(单位:ms)
  • 默认:10 * 1000

isLiveStream:

  • 类型:布尔
  • 描述:(可选项)是否是直播流
  • 默认:false

isDelayOptimization:

  • 类型:布尔
  • 描述:(可选项)是否进行延时优化(该参数只在直播流情况下生效)
  • 默认值:false

cacheBufferDuration:

  • 类型:数字
  • 描述:(可选项)缓存大小(单位:ms)
  • 默认:2000

maxCacheBufferDuration:

  • 类型:数字
  • 描述:(可选项)最大缓存大小(单位:ms)
  • 默认:4000

contentMode:

  • 类型:字符
  • 描述:(可选项)内容模式 (本参数暂仅支持 iOS 平台
  • 默认:fill
  • 取值范围:
    • fit :按比例缩放
    • fill:填充整个rect

fixedOn:

  • 类型:字符串
  • 描述:(可选项)模块添加到指定 frame 的名字(只指 frame,传 window 无效)
  • 默认:模块依附于当前 window

fixed:

  • 类型:布尔
  • 描述:(可选项)模块是否随所属 window 或 frame 滚动
  • 默认值:true(不随之滚动)

callback

Android 上无回调,请使用监听函数,监听状态。

ret:

  • 类型:JSON对象
  • 描述:返回值
{
    status : true   //布尔类型;表示播放器是否初始化成功
}

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.initPMediaPlayer({
   rect: {
       x: 0,
       y: 0,
       w: 'auto',
       h: 'auto'
   },
   dataUrl: 'rtmp://live.hkstv.hk.lxdns.com/live/hks',
   codec: 0,
   prepareTimeout: 10000,
   readTimeout: 10000,
   isLiveStream: false,
   isDelayOptimization: false,
   cacheBufferDuration: 2000,
   maxCacheBufferDuration: 4000,
   fixed: true
},function(ret) {
   alert(JSON.stringify(ret));
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

resetPlayerRect

重设播放器的 rect

resetPlayerRect({params}, callback(ret, err))

params

rect:

  • 类型:JSON 对象
  • 描述:(可选项)播放器的位置及尺寸
  • 内部字段:
{
    x: 0,   //(可选项)数字类型;模块左上角的 x 坐标(相对于所属的 Window 或 Frame);默认值:0
    y: 0,   //(可选项)数字类型;模块左上角的 y 坐标(相对于所属的 Window 或 Frame);默认值:0
    w: 80,  //(可选项)数字类型;模块的宽度;若传'auto',页面从x位置开始自动充满所属的 Window 或 Frame 的宽度;默认:'auto'
    h: 50   //(可选项)数字类型;模块的高度;若传'auto',页面从y位置开始自动充满所属的 Window 或 Frame 的高度;默认:'auto'
}

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.resetPlayerRect({
   rect: {
       x: 0,
       y: 0,
       w: 'auto',
       h: 'auto'
   }
});

可用性

iOS系统,Android系统

可提供的1.0.2及更高版本

setPLayerRotationsMode

重设播放器的 rotationsMode

setPLayerRotationsMode({params}, callback(ret, err))

params

mode:

  • 类型:字符串
  • 描述:(可选项)播放器的mode
  • 默认:noRotation
  • 取值范围:
    • noRotation:无旋转
    • rotateLeft:向左旋转
    • rotateRight:向右旋转
    • flipVertical:垂直翻转
    • flipHorizonal:水平翻转
    • rotate180:旋转 180 度

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.setPLayerRotationsMode({
   mode: 'rotateLeft'
});

可用性

iOS系统

可提供的1.0.2及更高版本

start

开始播放拉流视频

start(callback(ret, err))

callback

ret:

  • 类型:JSON对象
  • 描述:返回值
{
    status:true      //布尔类型;是否播放成功
}

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.start(function(ret) {
   alert(JSON.stringify(ret));
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

stop

停止拉流端视频播放器

stop()

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.stop();

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

pause

暂停拉流端视频播放器

当播放器处于 playing 或 caching 状态时调用该方法可以暂停播放器

pause(callback(ret, err))

callback

ret:

  • 类型:JSON对象
  • 描述:返回值
{
    status:true      //是否暂停成功
}

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.pause(function(ret) {
   alert(JSON.stringify(ret));
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

resume

恢复拉流端视频播放

当播放器处于暂停状态时调用该方法可以使播放器继续播放

resume(callback(ret, err))

callback

ret:

  • 类型:JSON对象
  • 描述:返回值
{
    status:true      //布尔类型;是否恢复成功
}

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.resume(function(ret) {
   alert(JSON.stringify(ret));
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

release

释放拉流端视频播放器占用的资源

release()

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.release();

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本

addFloatWindow

注意:此方法需要添加悬浮窗权限,需要到手机设置 -> 权限管理 -> 找到相应程序 ->打开悬浮窗权限

添加可随手指滑动而同步移动的悬浮窗口(相当于一个 frame),

该悬浮窗口是拉流端的视频播放器,同 initPMediaPlayer 接口打开的播放器同级。

start、stop、pause、resume、release 接口对本接口打开的播放器一样有效。

注意:

不可同时与 initPMediaPlayer 接口打开两个播放器!

addFloatWindow({params},callback(ret))

params

rect:

  • 类型:JSON 对象
  • 描述:悬浮窗的初始位置及尺寸
  • 内部字段:
{
    x: 0,   //(可选项)数字类型;悬浮窗左上角的 x 坐标;默认值:0
    y: 0,   //(可选项)数字类型;悬浮窗左上角的 y 坐标;默认值:0
    w: 90,  //(可选项)数字类型;悬浮窗的宽度,默认:90
    h: 120   //(可选项)数字类型;悬浮窗的高度,默认:120
}

callback

ret:

  • 类型:JSON对象
  • 描述:悬浮窗相应回调
{
    eventType : 'show' // 字符串类型;取值范围:
                       // close 关闭悬浮窗回调
                       // show  打开悬浮窗回调
                       // click 点击悬浮窗回调
}

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.addFloatWindow(function(ret){
   alert(JSON.stringify(ret));
});

startMainApp

从后台唤醒本app

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.startMainApp();

可用性

Android系统

可提供的1.0.0及更高版本

addEventListener

添加推流/拉流音视频状态监听

addEventListener({params},callback(ret, err))

params

name:

  • 类型:字符串
  • 描述:事件名称
  • 取值范围:
    • status(播放端音视频状态)
    • streamStatus(流状态已变更事件)

callback

ret:

  • 类型:JSON对象
  • 描述:状态
{
    eventType: "CALLBACK_STREAM", //字符串类型;交互事件类型,取值范围如下:
                                  //CALLBACK_STREAM:推流
                                  //CALLBACK_PLAYER :播放器
                                  //CALLBACK_CONFERENCE: 连麦
    status: 0           //数字类型;监听拉流(播放端)各种事件的状态码,仅当 name 为 status 时本值有值,取值范围如下:
                        // 0 代表: 未知状态,只会作为 init 后的初始状态,开始播放之后任何情况下都不会再回到此状态
                        // 1 代表: 正在准备播放所需组件,在调用 -start 方法时出现
                        // 2 代表: 播放组件准备完成,准备开始播放,在调用 -start 方法时出现
                        // 3 代表: 缓存数据为空状态,
                        // 特别需要注意的是当推流端停止推流之后,Player 将出现 caching 状态直到 timeout 后抛出 timeout 的 error 而不是出现 5 状态,
                        // 因此在直播场景中,当流停止之后一般做法是使用 IM 服务告知播放器停止播放,以达到即时响应主播断流的目的。
                        // 4 代表:正在播放状态。
                        // 5 代表:暂停状态。
                        // 6 代表:停止状态,该状态仅会在回放时播放结束出现,RTMP 直播结束并不会出现此状态在 android 平台上表示:io异常
                        // 7 代表:错误状态,播放出现错误时会出现此状态。仅支持ios平台
                        // 8 代表:自动重连的状态.仅支持ios平台      
                        // 9 代表:播放器因错误停止播放.仅支持ios平台
                        // 10  代表:与服务器连接断开          仅支持Android
                       // 11 代表:播放资源不存在            仅支持Android
                       // 12 代表:连接超时                 仅支持Android
                       // 13 代表:未授权,播放一个禁播的流    仅支持Android
                       // 14 代表:播放器准备超时            仅支持Android
                       // 15 代表:读取数据超时              仅支持Android
                       // 16 代表:硬解码失败                仅支持Android
                       // 17 代表:无效的URL                仅支持Android 
                       // 18 代表:开始缓冲                 仅支持Android 
                       // 19 代表:停止缓冲                 仅支持Android 
                       // 20 代表:第一帧视频已成功渲染        仅支持Android 
                       // 21 代表:第一帧音频已经成功播放      仅支持Android                
    streamStatus: 0     //仅取值'streamStatus'时返回
                        // 0 代表: 未知状态
                        // 1 代表: 连接中状态
                        // 2 代表: 已连接状态
                        // 3 代表: 断开连接中状态
                        // 4 代表: 已断开连接状态
                        // 5 代表: 正在等待自动重连状态,仅支持 ios 平台
                        // 6 代表: 错误状态
                        // 7 代表:关闭 ,仅支持Android 平台
                        // 8 代表:就绪  ,仅支持Android 平台
                        // 9 代表:准备中  ,仅支持Android 平台
                        // 10 代表:io异常(两种情况导致此异常,推流数据有问题或网络不可用)  ,仅支持Android 平台
                        //11 代表:摄像头切换  ,仅支持Android 平台
                        //12 代表:录音失败  ,仅支持Android 平台
                        //13 代表:打开摄像头失败  ,仅支持Android 平台
                        //14 代表:推流地址格式不正确  ,仅支持Android 平台
                        //15 代表:未授权的推流地址  ,仅支持Android 平台
                        //16 代表:重新开始推流 ,仅支持Android 平台
}

示例代码

var qiniuLive = api.require('qiniuLive');
qiniuLive.addEventListener({
     name: 'status'
},function(ret) {
     alert(JSON.stringify(ret));
});

可用性

iOS系统,Android系统

可提供的1.0.0及更高版本