##推流
initStreamingEnv requestStreamJson setStreamingProfile inputgainEnable setInputgain getInputgain toggleCamera startStream stopStream destroyStream turnLightOn turnLightOff setWithServerRegion setMuteMixedAudio
configConference startConference stopConference kickoutUser mute addRtcStateDidChangeListener addRtcDidFailListener addRoomOIListener resetRemoteWindowRect switchView getRtcViewUserIds
initPMediaPlayer
setPLayerRotationsMode
resetPlayerRect
start
stop
pause
resume
release
getScreenShot
addFloatWindow
startMainApp
seekTo
setVolume
getVolume
setBrightness
getBrightness
getDuration
getCurrentPosition
setSpeed
为帮助用户更好更快的使用插件,论坛维护了一个示例,示例中包含示例代码、知识点讲解、注意事项等,供您参考。
##由于本插件对应的七牛sdk版本很旧了,七牛已停止维护这个版本,不推荐再使用本插件。
七牛在视频直播大爆发时代,推出专为直播平台打造的全球化直播流服务和端到端直播场景解决方案,完美解决视频企业的三高之痛:技术门槛高、成本高、卡顿延时率高。 具体详见七牛云直播介绍
从推流到播放的一站式解决
七牛自建实时流网络(LiveNet),采用智能调度等技术,满足直播特有的网络需求;数据监控平台实现质量透明,帮助用户完成运营闭环;深耕场景丰富性与开放性,全面降低直播平台开发的技术门槛。
#####1.全球化的实时流网络
采用全新网络技术,实时计算全链路状态,按需智能伸缩最佳路径节点。实现秒开、低延迟不卡顿,和节点故障常态处理等直播需求
#####2.端到端,场景化 SDK
提供多平台采集 SDK 和播放 SDK,并开放云端 API 实现透明播控管理,助力企业开发者快速构建直播平台的核心业务,提高开发效率。
#####3.智能化质量监控
基于单个直播流业务粒度的线路质量智能监控及实时动态的数据统计,提供自动容错及全方位的数据分析,定位并优化直播卡顿率。
实时、连接、互动
实时录制、实时水印、实时截图、实时转码、实时鉴⻩、连麦互动、秒级禁播、延时直播 美颜滤镜
满足「直播+」各种行业的使用场景
在 Live 时代下,直播真正的机会在于做「直播+」,即直播跟其他各种领域和垂直行业的结合。七牛直播云,能够更快速、更灵活、更开放的满足不同行业、场景的客户对直播功能的需求,并广泛应用于活动,监控,游戏,电台,教学,VR,社交,无人机等众多行业领域。如:
PANDA TV、懂足球、大神TV等
qiniuLive 封装了七牛直播云服务平台的移动端开放 SDK。该插件包括视频流采集和视频流播放两部分:
####1,推流
开发者可通过调用 setStreamingProfile 接口打开一个的视频采集器(相当于 open 一个 frame),将摄像头收集到的视频推流到服务器端,注意这里需要开发者自己搭建业务服务器,可参考七牛直播入门指南。开发者可通过配置相应参数来自定义视频采集预览器样式、视频质量、美颜等功能。亦可以通过toggleCamera、startStream、stopStream、destroyStream 接口来控制视频采集器,实现停止、开始、切换前后摄像头等功能。
####2,拉流
拉流就是指将服务器端的直播视频流下载到本地同时播放,开发者可通过 initPMediaPlayer 接口打开一个可自定义位置和大小的视频播放区域(相当于 open 一个 frame)。然后通过start、stop、pause、resume、接口实现开始、停止、暂停、播放等操作。本插件封装提供了一个打开悬浮窗口的接口,YonBuilder移动开发 平台的开发者可通过调用此接口打开一个悬浮的拉流视频播放器,可随用户手指滑动而移动,效果炫酷。
使用本插件之前需先到七牛官网申请开发者账号,并在账号内创建 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(callback(ret))
ret:
{
status: true //布尔类型;是否初始化成功
}
var qiniuLive = api.require('qiniuLive');
qiniuLive.initStreamingEnv(function(ret){
api.alert({msg: JSON.stringify(ret)});
});
iOS系统,Android系统
可提供的1.0.0及更高版本
请求直播流信息 JSON 字符串,
建议使用 setStreamingProfile 接口的 pushUrl 参数替代此接口,
可从业务服务器获取推流地址。
注意:
若调用本接口,则 setStreamingProfile 接口的 pushUrl 参数可不传。
requestStreamJson({params}, callback(ret, err))
requestUrl:
ret:
{
streamJson : '' // 字符串类型;返回直播流的信息
}
var qiniuLive = api.require('qiniuLive');
qiniuLive.requestStreamJson({
requestUrl : 'http://xxx.xxx.com'
}, function(ret){
api.alert({msg: JSON.stringify(ret)});
});
iOS系统,Android系统
可提供的1.0.0及更高版本
配置直播流参数,初始化推流预览区域
setStreamingProfile({params},callback(ret,err))
rect:
{
x: 0, //(可选项)数字类型;插件左上角的 x 坐标(相对于所属的 Window 或 Frame);默认值:0
y: 0, //(可选项)数字类型;插件左上角的 y 坐标(相对于所属的 Window 或 Frame);默认值:0
w: 300, //(可选项)数字类型;插件的宽度;默认:'auto'
h: 400. //(可选项)数字类型;插件的高度;默认:'auto'
}
remoteWindowRect:
[{
x: 0, //(可选项)数字类型;连麦小窗口的左上角的 x 坐标(相对于本接口打开的预览窗口);默认值:0
y: 0, //(可选项)数字类型;连麦小窗口的左上角的 y 坐标(相对于本接口打开的预览窗口);默认值:0
w: 120, //(可选项)数字类型;连麦小窗口的的宽度;120;
h: 160 //(可选项)数字类型;连麦小窗口的的高度;160;
}]
pushUrl:
videoCapture:
{
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:
{
previewSizeLevel: 'small', // 字符类型;相机预览大小等级
// 取值范围:small, medium, large
previewSizeRatio: 'ratio_4_3' // 字符类型;相机预览大小比例
// 取值范围:ratio_4_3, ratio_16_9
}
videoEncodeHeight:
videoStream:
{
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:
face:
{
beautify:false //(可选项)布尔类型;是否开启美颜模式;默认:false
setBeautify:0 //(可选项)数字类型;设置美颜程度,范围是从0 ~ 1,0为不美颜(如果美颜不开启,该参数无效);默认:0
setWhiten:0 //(可选项)数字类型;设置美白程度,范围是从0 ~ 1,0为不美白(如果美颜不开启,该参数无效);默认:0
setRedden: 0 //(可选项)数字类型;设置红润程度,范围是从0 ~ 1,0为不红润(如果美颜不开启,该参数无效);默认:0
}
localWinPosition:
{
x:0, // 合流视频的位置x
y:0, // 合流视频的位置y
w:100, // 合流视频的宽度
h:100 // 合流视频的高度
}
continuousFocus:
encodeOritation:
fixedOn:
fixed:
ret:
{
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) {
api.alert({msg: JSON.stringify(ret)});
});
iOS系统,Android系统
可提供的1.0.0及更高版本
当前设备是否支持设置录音音量 注意:该方法仅支持ios
inputgainEnable(callback(ret))
ret:
{
enalbe: true //布尔类型;是否支持设置麦克风音量
}
qiniuLive = api.require('qiniuLive');
qiniuLive.inputgainEnable(function(ret) {
api.alert({msg: JSON.stringify(ret)});
});
iOS系统
可提供的1.0.8及更高版本
获取麦克风音量大小,取值范围:0-1 注意:该方法仅支持ios
getInputgain(callback(ret))
ret:
{
inputgain: 0.7 //数字类型;麦克风音量
}
qiniuLive = api.require('qiniuLive');
qiniuLive.getInputgain(function(ret) {
api.alert({msg: JSON.stringify(ret)});
});
iOS系统
可提供的1.0.8及更高版本
设置麦克风音量大小,取值范围:0-1 注意:该方法仅支持ios
setInputgain({params}})
inputgain:
qiniuLive = api.require('qiniuLive');
qiniuLive.setInputgain({
inputgain:0.8
});
iOS系统
可提供的1.0.8及更高版本
切换前后摄像头
toggleCamera()
var qiniuLive = api.require('qiniuLive');
qiniuLive.toggleCamera();
iOS系统,Android系统
可提供的1.0.0及更高版本
开始推流,当播放异常时亦可通过此接口发起重链请求,刷新视频播放器,(注:android只有在收到streamStatus状态为17(准备就绪)后才允许调用此方法)
startStream(callback(ret))
#callback
ret:
{
status:true //布尔类型;是否推流成功
}
var qiniuLive = api.require('qiniuLive');
qiniuLive.startStream(function(ret){
api.alert({msg: JSON.stringify(ret)});
});
iOS系统,Android系统
可提供的1.0.0及更高版本
结束推流
stopStream(callback(ret))
#callback
ret:
{
status:true //是否结束推流
}
var qiniuLive = api.require('qiniuLive');
qiniuLive.stopStream(function(ret){
api.alert({msg: JSON.stringify(ret)});
});
iOS系统,Android系统
可提供的1.0.0及更高版本
销毁推流,释放资源
destroyStream()
var qiniuLive = api.require('qiniuLive');
qiniuLive.destroyStream();
iOS系统,Android系统
可提供的1.0.0及更高版本
打开闪光灯
turnLightOn()
var qiniuLive = api.require('qiniuLive');
qiniuLive.turnLightOn();
iOS系统,Android系统
可提供的1.0.5及更高版本
关闭闪光灯
turnLightOff()
var qiniuLive = api.require('qiniuLive');
qiniuLive.turnLightOff();
iOS系统,Android系统
可提供的1.0.5及更高版本
初始化连麦参数,设置服务器区域
注意:
在iOS平台上必须在调用 startConference 接口之前调用本接口。并在状态(通过addRtcStateDidChangeListener监听)变更为 inited 后方可调用 startConference 接口。建议在 setStreamingProfile 接口的回调里调用本接口。
setWithServerRegion({params})
serverRegionID:
serverRegionName:
var qiniuLive = api.require('qiniuLive');
qiniuLive.setWithServerRegion();
iOS系统
可提供的1.1.2及更高版本
设置是否推流的音频静音
setMuteMixedAudio({params})
muteMixedAudio:
var qiniuLive = api.require('qiniuLive');
qiniuLive.setMuteMixedAudio();
iOS系统
可提供的1.1.2及更高版本
配置连麦
注意:
在iOS平台上必须在调用本接口之前调用 setWithServerRegion 接口。并在状态(通过addRtcStateDidChangeListener监听)变更为 inited 后方可调用本接口。
configConference({params}, callback(ret))
videoEncodingSizeRatio:
videoEncodingSize:
mixVideoSize:
{
width: 300, // 数字类型;宽度
height: 400. // 数字类型;高度
}
localVideoRect:
{
x: 0, //(可选项)数字类型;x 坐标;默认值:0
y: 0, //(可选项)数字类型;y 坐标;默认值:0
width: 300, //(可选项)数字类型;宽度;默认值:100
height: 400 //(可选项)数字类型;高度;默认值:100
}
videoBitrateRange:
{
from : 100 * 1000,
to : 300 * 1000
}
fps:
mixOverlayRectArray:
[{
x: 0, //数字类型;在合流主窗口的 x 轴方向上的位置(相对于setStreamingProfile 接口打开的预览窗口)
y: 0, //数字类型;在合流主窗口的 y 轴方向上的位置(相对于setStreamingProfile 接口打开的预览窗口)
w: 100, //数字类型;合流窗口的宽度;默认:100
h: 100 //数字类型;合流窗口的高度;默认:100
}]
mixOverlayRatios:
[{
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:
connetTimeout:
ret:
{
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) {
api.alert({msg: JSON.stringify(ret)});
});
iOS系统,Android系统
可提供的1.0.0及更高版本
开始连麦。可通过 addRtcStateDidChangeListener、addRtcDidFailListener、addRoomOIListener 得到连麦的状态
startConference({params})
userId:
roomName:
roomToken:
var qiniuLive = api.require('qiniuLive');
qiniuLive.startConference({
userId:'',
roomName:'',
roomToken:''
});
iOS系统,Android系统
可提供的1.0.0及更高版本
停止连麦,结束连麦后,会停止推送本地音视频流,同时停止拉取房间中的音视频流。可通过 addRtcStateDidChangeListener、addRtcDidFailListener、addRoomOIListener 得到连麦的状态
stopConference({params}, callback(ret))
ret:
{
status : true // 布尔类型;表示操作是否失败
}
var qiniuLive = api.require('qiniuLive');
qiniuLive.stopConference(function(ret) {
api.alert({msg: JSON.stringify(ret)});
});
iOS系统,Android系统
可提供的1.0.0及更高版本
踢出指定 userID 的用户,只有主播才有踢人的权限。
kickoutUser({params}, callback(ret))
userId:
ret:
{
status : true // 布尔类型;
}
var qiniuLive = api.require('qiniuLive');
qiniuLive.kickoutUser({
userId:''
},function(ret) {
api.alert({msg: JSON.stringify(ret)});
});
iOS系统,Android系统
可提供的1.0.0及更高版本
设置静音模式,推流的静音模式
mute({params})
isMute:
var qiniuLive = api.require('qiniuLive');
qiniuLive.mute({isMute:true});
iOS系统,Android系统
可提供的1.0.0及更高版本
连麦状态已变更的回调
addRtcStateDidChangeListener(callback(ret))
ret:
{
state: 'started' // 字符串类型;连麦状态,连麦状态改变时触发本回调事件,取值范围如下:
// unknown 代表: 未知状态、未 init 时的初始状态
// started 代表: 已进入到连麦的状态
// stopped 代表: 连麦已结束的状态
// inited 代表:init 成功时的状态
}
var qiniuLive = api.require('qiniuLive');
qiniuLive.addRtcStateDidChangeListener(function(ret) {
api.alert({msg:JSON.stringify(ret)});
});
iOS系统,Android系统
可提供的1.0.0及更高版本
连麦产生了某个 error 的回调
addRtcDidFailListener(callback(ret))
ret:
{
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(callback(ret))
ret:
{
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({params}, callback(ret))
userId:
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) {
api.alert({msg: JSON.stringify(ret)});
});
iOS系统,Android系统
可提供的1.0.0及更高版本
切换预览窗口和指定(通过userId)的连麦窗口的位置和大小
switchView()
userId:
var qiniuLive = api.require('qiniuLive');
qiniuLive.switchView({
userId: ''
});
iOS系统,Android系统
可提供的1.0.5及更高版本
获取当前所有连麦小窗口的userID
getRtcViewUserIds(callback(ret))
ret:
{
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({params}, callback(ret, err))
rect:
{
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:
codec:
prepareTimeout:
readTimeout:
isLiveStream:
isDelayOptimization:
cacheBufferDuration:
maxCacheBufferDuration:
contentMode:
fixedOn:
fixed:
Android 上无回调,请使用监听函数,监听状态。
ret:
{
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) {
api.alert({msg: JSON.stringify(ret)});
});
iOS系统,Android系统
可提供的1.0.0及更高版本
重设播放器的 rect
resetPlayerRect({params}, callback(ret, err))
rect:
{
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及更高版本
重设播放器的 rotationsMode
setPLayerRotationsMode({params}, callback(ret, err))
mode:
var qiniuLive = api.require('qiniuLive');
qiniuLive.setPLayerRotationsMode({
mode: 'rotateLeft'
});
iOS系统
可提供的1.0.2及更高版本
开始播放拉流视频
start(callback(ret, err))
#callback
ret:
{
status:true //布尔类型;是否播放成功
}
var qiniuLive = api.require('qiniuLive');
qiniuLive.start(function(ret) {
api.alert({msg: JSON.stringify(ret)});
});
iOS系统,Android系统
可提供的1.0.0及更高版本
停止拉流端视频播放器
stop()
var qiniuLive = api.require('qiniuLive');
qiniuLive.stop();
iOS系统,Android系统
可提供的1.0.0及更高版本
暂停拉流端视频播放器
当播放器处于 playing 或 caching 状态时调用该方法可以暂停播放器
pause(callback(ret, err))
#callback
ret:
{
status:true //是否暂停成功
}
var qiniuLive = api.require('qiniuLive');
qiniuLive.pause(function(ret) {
api.alert({msg: JSON.stringify(ret)});
});
iOS系统,Android系统
可提供的1.0.0及更高版本
恢复拉流端视频播放
当播放器处于暂停状态时调用该方法可以使播放器继续播放
resume(callback(ret, err))
#callback
ret:
{
status:true //布尔类型;是否恢复成功
}
var qiniuLive = api.require('qiniuLive');
qiniuLive.resume(function(ret) {
api.alert({msg: JSON.stringify(ret)});
});
iOS系统,Android系统
可提供的1.0.0及更高版本
释放拉流端视频播放器占用的资源
release()
var qiniuLive = api.require('qiniuLive');
qiniuLive.release();
iOS系统,Android系统
可提供的1.0.0及更高版本
截屏
getScreenShot(callback(ret))
#callback
ret:
{
destPath:'' // 字符串类型;返回截屏路径
}
var qiniuLive = api.require('qiniuLive');
qiniuLive.getScreenShot(function(ret){
var msg = "路径" + ret.destPath;
api.toast({
msg: msg
});
});
iOS系统,Android系统
可提供的1.0.0及更高版本
注意:此方法需要添加悬浮窗权限,需要到手机设置 -> 权限管理 -> 找到相应程序 ->打开悬浮窗权限
添加可随手指滑动而同步移动的悬浮窗口(相当于一个 frame),
该悬浮窗口是拉流端的视频播放器,同 initPMediaPlayer 接口打开的播放器同级。
start、stop、pause、resume、release 接口对本接口打开的播放器一样有效。
注意:
不可同时与 initPMediaPlayer 接口打开两个播放器!
addFloatWindow({params},callback(ret))
rect:
{
x: 0, //(可选项)数字类型;悬浮窗左上角的 x 坐标;默认值:0
y: 0, //(可选项)数字类型;悬浮窗左上角的 y 坐标;默认值:0
w: 90, //(可选项)数字类型;悬浮窗的宽度,默认:90
h: 120 //(可选项)数字类型;悬浮窗的高度,默认:120
}
ret:
{
eventType : 'show' // 字符串类型;取值范围:
// close 关闭悬浮窗回调
// show 打开悬浮窗回调
// click 点击悬浮窗回调
}
var qiniuLive = api.require('qiniuLive');
qiniuLive.addFloatWindow(function(ret){
api.alert({msg: JSON.stringify(ret)});
});
iOS系统,Android系统
可提供的1.0.0及更高版本
从后台唤醒本app
var qiniuLive = api.require('qiniuLive');
qiniuLive.startMainApp();
Android系统
可提供的1.0.0及更高版本
快速定位到指定播放时间点
seekTo({params})
seconds:
var qiniuLive = api.require('qiniuLive');
qiniuLive.seekTo({
seconds: 20
});
iOS系统,Android系统
可提供的1.1.6及更高版本
设置音量
setVolume({params})
volume:
var qiniuLive = api.require('qiniuLive');
qiniuLive.setVolume({
volume: 0.6
});
iOS系统,Android系统
可提供的1.1.6及更高版本
获取当前播放音量
getVolume(callback(ret))
ret:
{
volume: //数字类型;当前音量值
}
var qiniuLive = api.require('qiniuLive');
qiniuLive.getVolume(function(ret) {
if (ret) {
api.alert({msg: JSON.stringify(ret)});
}
});
iOS系统,Android系统
可提供的1.1.6及更高版本
设置屏幕亮度
setBrightness({params})
brightness:
var qiniuLive = api.require('qiniuLive');
qiniuLive.setBrightness({
brightness: 50
});
iOS系统,Android系统
可提供的1.1.6及更高版本
获取当前屏幕亮度值
getBrightness(callback(ret))
ret:
{
brightness: //数字类型;当前屏幕亮度值
}
var qiniuLive = api.require('qiniuLive');
qiniuLive.getBrightness(function(ret, err) {
if (ret) {
api.alert({msg: JSON.stringify(ret)});
}
});
iOS系统,Android系统
可提供的1.1.6及更高版本
获取视频的时长
getDuration(callback(ret))
ret:
{
duration: 1221122 //数字类型;视频的总时长
}
var qiniuLive = api.require('qiniuLive');
qiniuLive.getDuration(function(ret) {
if (ret) {
api.alert({msg: JSON.stringify(ret)});
}
});
iOS系统,Android系统
可提供的1.1.6及更高版本
获取已经播放的时长
getCurrentPosition(callback(ret))
ret:
{
currentPosition:888 //数字类型;已经播放的时长
}
var qiniuLive = api.require('qiniuLive');
qiniuLive.getCurrentPosition(function(ret) {
if (ret) {
api.alert({msg: JSON.stringify(ret)});
}
});
iOS系统,Android系统
可提供的1.1.6及更高版本
倍速播放
setSpeed({params})
speed:
var qiniuLive = api.require('qiniuLive');
qiniuLive.setSpeed({
speed : 1.9
});
iOS系统,Android系统
可提供的1.0.0及更高版本
添加推流/拉流音视频状态监听
addEventListener({params},callback(ret, err))
name:
ret:
{
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、
// 12 代表:播放器已被销毁 仅支持Android
// 13 代表:so 库版本不匹配,需要升级 仅支持Android
// 14 代表:AudioTrack 初始化失败,可能无法播放音频 仅支持Android
// 16 代表:硬解码失败 仅支持Android
// 17 代表:播放器打开失败 仅支持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 代表:无法连接流媒体服务器(两种情况导致此异常,推流数据有问题或网络不可用) ,仅支持Android 平台
//11 代表:摄像头切换 ,仅支持Android 平台
//12 代表:打开麦克风失败 ,仅支持Android 平台
//13 代表:打开摄像头失败 ,仅支持Android 平台
//14 代表:无效的推流地址 ,仅支持Android 平台
//15 代表:未授权的推流地址 ,仅支持Android 平台
//16 代表:重新开始推流 ,仅支持Android 平台
//17 代表:准备就绪, 仅支持android平台
}
var qiniuLive = api.require('qiniuLive');
qiniuLive.addEventListener({
name: 'status'
},function(ret) {
api.alert({msg: JSON.stringify(ret)});
});
iOS系统,Android系统
可提供的1.0.0及更高版本