保利威(商标名“POLYV”)是一个第三方视频技术服务商,提供视频云计算服务平台,为教育行业等提供视频解决方案,隶属于广州易方信息科技有限公司,实现网络视频跨终端播放,是一家拥有自主知识产权的高新技术企业。
polyvVideo 插件封装了保利威 Android 与 iOS 原生 SDK,集成了保利威常用的基本接口。使用本插件可以轻松把保利威 Android 与 iOS SDK 集成到自己的 app 中,实现保利威视频播放、下载等功能。
setConfig
方法配置 SDK 加密串。polyvConfigModule 封装了对本插件用户配置的功能。
开发者要播放保利威视频,需先到 保利威官网 注册账号,登录账号后,进入云点播 \ 设置 \ API接口 \ SDK加密串获取 SDK 加密串、 加密密钥、加密向量,并将其放到自己的服务器,在 Application 中通过网络获取并且设置给 setConfig 方法(推荐方案)。也可以配置 SDK加密串
到 key.xml 文件中,key 为 config
,key.xml 文件需要放在 res 文件目录下。
key.xml 配置详解:
配置格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<security>
<item name="config" value="CMWht3MlpVkgpFzrLNAebYi4RdQDY/Nhvk3Kc+qWcck6chwHYKfl9o2aOVBvXVTRZD/14XFzVP7U5un43caq1FXwl0cYmTfimjTmNUYa1sZC1pkHE8gEsRpwpweQtEIiTGVEWrYVNo4/o5jI2/efzA=="/>
</security>
字段描述:
初始化点播SDK配置(仅Android系统需要设置,且仅设置一次)
此设置会设置视频资源的下载目录、日志保存路径,因此会访问 SDCard数据,需要根据实际情况进行提醒,防止上架市场被拒。(需要 android.permission.WRITE_EXTERNAL_STORAGE
权限)
var polyvConfig = api.require('polyvConfigModule');
polyvConfig.initVideoSetting();
Android系统
可提供的1.3.8及更高版本
配置本插件来自保利威注册账号的用户信息,本方法只需调用一次。
固定的加密方式,开发者可在开发时使用,但安全性不如 setToken 方式,不推荐使用在正式环境。
setConfig()
config
:
aeskey
:
iv
:
{
isSuccess: //布尔类型;是否设置成功。
}
{
msg: //字符串类型;错误信息
}
var polyvConfig = api.require('polyvConfigModule');
polyvConfig.setConfig({
config:'CMWht3MlpVkgpFzrLNAebYi4RdQDY/Nhvk3Kc+qWcck6chwHYKfl9o2aOVBvXVTRZD/14XFzVP7U5un43caq1FXwl0cYmTfimjTmNUYa1sZC1pkHE8gEsRpwpweQtEIiTGVEWrYVNo4/o5jI2/efzA==',
aeskey:'VXtlHmwfS2oYm0CZ',
iv:'2u9gDPKdX6GyQJKU'
}, function(ret, err) {
alert(ret.isSuccess);
});
iOS系统,Android系统
可提供的1.0.0及更高版本
配置本插件来自保利威注册账号的用户信息,本方法只需调用一次。
推荐使用 https 接口,从服务端获取加密串,APP 本地解密(开发者设计自己的加解密方式)得到 useId
、readtoken
、writetoken
、secretkey
,再使用该方法配置用户信息。
setToken()
userid
:
readtoken
:
writetoken
:
secretkey
:
{
isSuccess: //布尔类型;是否设置成功。
}
{
msg: //字符串类型;错误信息
}
var polyvConfig = api.require('polyvConfigModule');
polyvConfig.setToken({
userid:'6a83c6abfd',
readtoken:'6365ddc9-2ce1-4341-ae86-4542718a42a1',
writetoken:'7c7b499d-7999-4a36-b068-e7372b787408',
secretkey:'7E7LOdvpd1'
}, function(ret, err) {
alert(ret.isSuccess);
});
iOS系统,Android系统
可提供的1.2.3及更高版本
设置播放器为硬解解码播放,默认关闭。【视频播放前设置】
openMediaCodec({params})
mediaCodec
{
mediaCodec: // 布尔类型
}
var polyvConfig = api.require('polyvConfigModule');
polyvConfig.openMediaCodec({
mediaCodec:false
});
Android系统
可提供的1.2.1及更高版本
iOS系统
可提供的1.2.8及更高版本
polyvVideoModule 封装了保利威视频播放功能。
设置播放器渲染视图类型
setRenderView({params})
renderViewType
{
renderViewType: // 整型数字:渲染视图类型
}
var polyvConfig = api.require('polyvConfigModule');
polyvConfig.setRenderView({
renderViewType:2
});
Android系统
可提供的1.1.0及更高版本
设置自定义Token解密视频
播放加密视频时,若设置此Token将优先使用此Token来解密视频;请在调用播放加密视频方法(setVid)前调用此方法
setCustomVideoToken({params},function(ret))
token
:
{
isSuccess: //布尔类型;是否设置成功。
}
{ msg: //字符串类型;错误信息 }
iOS系统,Android系统
可提供的1.3.8及更高版本
打开一个视频播放器,通过回调返回播放状态
open({params},function(ret))
rect
:
{
x: 0, //(可选项)数字类型;插件左上角的 x 坐标(相对于所属的 Window 或 Frame);默认:0
y: 0, //(可选项)数字类型;插件左上角的 y 坐标(相对于所属的 Window 或 Frame);默认:0
w: 320, //(可选项)数字类型;插件的宽度;默认:所属的 Window 或 Frame 的宽度
h: 300 //(可选项)数字类型;插件的高度;默认:w的3/4
}
path
:
vid
:
autoPlay
:
fixedOn
:
fixed
:
seekType
:
disableScreenCAP
:
level
:
{
eventType: //字符串类型;回调事件类型,取值范围如下:
//config_invalid(未配置加密串)
//show (打开播放器成功并显示)
//start(开始播放)
//stop(停止播放)
//pause(暂停播放)
//resetPath(重设媒体资源路径)
//complete(播放完毕)
}
{
msg: //字符串类型;错误信息
}
var obj = api.require('polyvVideoModule');
obj.open({
rect: {
x: 0,
y: 0,
w: 320,
h: 240
},
path:'fs://res/intro.mp4', // 传递本地路径
// vid:'c538856dde4302916f648ee0d225cbca_c', // 传递 vid
autoPlay: true,
fixedOn: api.frameName,
fixed: false
},function(ret,err){
var eventType = ret.eventType;
});
iOS系统,Android系统
可提供的1.0.0及更高版本
设置视频的文件路径
setPath({params})
path
:
var obj= api.require('polyvVideoModule');
obj.setPath({
path:'fs://res/video.mp4'
});
iOS系统,Android系统
可提供的1.0.0及更高版本
设置播放视频的 vid
setVid({params})
vid
:
level
:
var obj= api.require('polyvVideoModule');
obj.setVid({
vid:'c538856dde4302916f648ee0d225cbca_c',
});
iOS系统,Android系统
可提供的1.0.0及更高版本
开始播放
start()
var obj= api.require('polyvVideoModule');
obj.start();
iOS系统,Android系统
可提供的1.0.0及更高版本
暂停播放
pause()
var obj= api.require('polyvVideoModule');
obj.pause();
iOS系统,Android系统
可提供的1.0.0及更高版本
停止播放
stop()
var obj= api.require('polyvVideoModule');
obj.stop();
iOS系统,Android系统
可提供的1.0.0及更高版本
关闭播放器
close()
var obj= api.require('polyvVideoModule');
obj.close();
iOS系统,Android系统
可提供的1.0.0及更高版本
显示视频播放视图
show()
var obj= api.require('polyvVideoModule');
obj.show();
iOS系统,Android系统
可提供的1.0.0及更高版本
隐藏视频播放视图
hide()
var obj= api.require('polyvVideoModule');
obj.hide();
iOS系统,Android系统
可提供的1.0.0及更高版本
全屏播放,(横屏模式)。v1.2.3 全屏时 Android 隐藏状态栏。
fullScreen(callBack(ret))
类型:JSON对象
内部字段:
{
eventType: show //(打开播放器成功并显示)
}
var obj= api.require('polyvVideoModule');
obj.fullScreen(function(ret,err){
if (ret.eventType === 'show'){
//do something
}
});
iOS系统,Android系统
可提供的1.0.0及更高版本
取消全屏播放。v1.2.3 取消全屏后, Android 取消隐藏状态栏。
cancelFullScreen(callBack(ret))
类型:JSON对象
内部字段:
{
eventType: show //(打开播放器成功并显示)
}
var obj= api.require('polyvVideoModule');
obj.cancelFullScreen(function(ret,err){
if (ret.eventType === 'show'){
//do something
}
});
iOS系统,Android系统
可提供的1.0.0及更高版本
获得当前视频时长
getDuration(callBack(ret))
{
duration: // 数字类型;当前视频时长;秒
}
var obj = api.require('polyvVideoModule');
obj.getDuration(function(ret,err){
alert(ret.duration);
});
iOS系统,Android系统
可提供的1.0.0及更高版本
获取视频当前播放位置(时间)
getCurrentPosition(callBack(ret))
{
currentPosition: // 数字类型;视频当前播放进度(时间);秒
}
var obj = api.require('polyvVideoModule');
obj.getCurrentPosition(function(ret,err){
alert(ret.currentPosition);
});
iOS系统,Android系统
可提供的1.0.0及更高版本
获取视频当前缓存进度
getBufferPercentage(callBack(ret))
{
bufferPercentage: // 数字类型,取值:0~100;当前缓存进度
}
var obj = api.require('polyvVideoModule');
obj.getBufferPercentage(function(ret,err){
alert(ret.bufferPercentage);
});
iOS系统,Android系统
可提供的1.0.0及更高版本
当前视频是否正在播放
isPlaying(callBack(ret))
{
isPlaying: // bool 类型;视频是否正在播放
}
var obj = api.require('polyvVideoModule');
obj.isPlaying(function(ret,err){
alert(ret.isPlaying);
});
iOS系统,Android系统
可提供的1.0.0及更高版本
快进
forward(params)
seconds
:
var obj= api.require('polyvVideoModule');
obj.forward({
seconds:5
});
iOS系统,Android系统
可提供的1.0.0及更高版本
快退
rewind(params)
seconds
:
var obj= api.require('polyvVideoModule');
obj.rewind({
seconds:5
});
iOS系统,Android系统
可提供的1.0.0及更高版本
跳转
seekTo(params)
seconds
:
var obj= api.require('polyvVideoModule');
obj.seekTo({
seconds:20
});
iOS系统,Android系统
可提供的1.0.0及更高版本
设置屏幕亮度
setBrightness(params)
brightness
:
var obj = api.require('polyvVideoModule');
obj.setBrightness({
brightness:50
});
iOS系统,Android系统
可提供的1.0.0及更高版本
获取当前屏幕亮度值
getBrightness(callBack(ret))
ret
:
{
brightness: //数字类型;当前屏幕亮度值
}
var obj = api.require('polyvVideoModule');
obj.getBrightness(function(ret,err){
alert(ret.brightness);
});
iOS系统,Android系统
可提供的1.0.0及更高版本
设置是否调节系统音量
setAdjustSystemVolume({params})
isAdjust
:
var obj = api.require('polyvVideoModule');
obj.setAdjustSystemVolume({
isAdjust:true
});
iOS系统,Android系统
可提供的1.3.4及更高版本
设置视频音量
setVolume({params})
volume
:
var obj = api.require('polyvVideoModule');
obj.setVolume({
volume:0.6
});
iOS系统,Android系统
可提供的1.0.0及更高版本
获取当前视频音量
getVolume(callBack(ret,err))
{
volume: //数字类型;当前音量值
}
var obj = api.require('polyvVideoModule');
obj.getVolume(function(ret){
alert(ret.volume)
});
iOS系统,Android系统
可提供的1.0.0及更高版本
添加手势监听(当全屏或者 fixed 为 true 且页面不能被左右滑动时有效)
addEventListener({params},callBack(ret,err))
name
:
leftUp
:播放器靠左的二分之一内的上滑事件,每滑动5(百分比)回调执行一次leftDown
:播放器靠左的二分之一内的下滑事件,每滑动5(百分比)回调执行一次rightUp
:播放器靠右的二分之一内的上滑事件,每滑动5(百分比)回调执行一次rightDown
:播放器靠右的二分之一内的下滑事件,每滑动5(百分比)回调执行一次swipeLeft
:播放器上的左滑事件,每滑动5(百分比)回调执行一次swipeRight
:播放器上的右滑事件,每滑动5(百分比)回调执行一次click
:点击播放器事件(单击手势){
start: //布尔类型;事件是否开始,true|false
end: //布尔类型;事件是否结束,true|false
//手指处于滑动屏幕状态时,start、end 均为false
}
var obj = api.require('polyvVideoModule');
obj.addEventListener({
name:'leftUp'
},function(ret){
alert('leftUp');
});
iOS系统,Android系统
可提供的1.0.0及更高版本
移除手势监听
removeEventListener({params})
name
:
leftUp
:播放器靠左的二分之一内的上滑事件,每滑动5(百分比)回调执行一次leftDown
:播放器靠左的二分之一内的下滑事件,每滑动5(百分比)回调执行一次rightUp
:播放器靠右的二分之一内的上滑事件,每滑动5(百分比)回调执行一次rightDown
:播放器靠右的二分之一内的下滑事件,每滑动5(百分比)回调执行一次swipeLeft
:播放器上的左滑事件,每滑动5(百分比)回调执行一次swipeRight
:播放器上的右滑事件,每滑动5(百分比)回调执行一次click
:点击播放器事件(单击手势)var obj = api.require('polyvVideoModule');
obj.removeEventListener({
name:'leftUp'
});
iOS系统,Android系统
可提供的1.0.0及更高版本
设置播放速度
setSpeed({params})
speed
:
var obj = api.require('polyvVideoModule');
obj.setSpeed({
speed:2.0
});
iOS系统,Android系统
可提供的1.0.7及更高版本
获取当前播放速度
getSpeed(callBack(ret))
ret
:
{
speed: //数字类型;当前播放速度
}
var obj = api.require('polyvVideoModule');
obj.speed(function(ret,err){
alert(ret.speed);
});
iOS系统,Android系统
可提供的1.0.7及更高版本
显示跑马灯
showMarquee({params})
marquee
:
duration
:
interval
:
color
:
font
:
alpha
:
var obj = api.require('polyvVideoModule');
obj.showMarquee({
marquee:'polyv',
duration:10
});
iOS系统,Android系统
可提供的1.0.7及更高版本
隐藏跑马灯
hideMarquee()
var obj= api.require('polyvVideoModule');
obj.hideMarquee();
Android系统,可提供的1.0.7及更高版本
iOS系统,1.0.7版本开始支持,1.2.0-1.2.5版本废除这个方法,1.2.6版本继续支持
设置观众ID,对应观看日志中的自定义ID。
setViewerId()
var obj= api.require('polyvVideoModule');
obj.setViewerId({
viewerId:'polyv'
});
iOS系统,Android系统
可提供的1.0.8及更高版本
设置观众昵称,对应观看日志中的观众昵称。
setViewerName()
var obj= api.require('polyvVideoModule');
obj.setViewerName({
viewerName:'polyv'
});
iOS系统,Android系统
可提供的1.0.8及更高版本
设置观众昵称,对应观看日志中的观众昵称。 其中,param2 和 setViewerName 是相同的数据项,只设置其中一个即可。
setParam()
var obj= api.require('polyvVideoModule');
obj.setParam({
param2:"p2",
param3:"p3",
param4:"p4",
param5:"p5",
});
iOS系统,Android系统
可提供的1.0.8及更高版本
切换视频码率
changeLevel({params})
level
:
var obj= api.require('polyvVideoModule');
obj.changeLevel({
level:1,
});
iOS系统,Android系统
可提供的1.2.0及更高版本
获取当前播放视频码率
getCurrentLevel(function(ret))
{
currentLevel: // 1-流畅, 2-高清, 3-超清
}
var obj= api.require('polyvVideoModule');
obj.getCurrentLevel(function(ret, err){
alert(ret.currentLevel)
});
iOS系统,Android系统
可提供的1.2.0及更高版本
切换当前视频的解码方式【视频播放中可切换】
setMediaHardDecode({params})
mediaCodec
:
获取当前视频是否为硬解码
getMediaHardDecode((function(ret)))
mediaCodec
:
保存视频截图
snapshot({params}, callBack(ret,err))
isSave
:
{
imgData: //当前截图的base64图片数据
}
var obj = api.require('polyvVideoModule');
obj.snapshot({
isSave:true,
}, function(ret, err) {
//ret.imgData
});
iOS系统,Android系统
可提供的1.2.3及更高版本
设置播放器防录屏开关(仅对Android有效!)
disableScreenCAP({params})
disableScreenCAP
:
var obj= api.require('polyvVideoModule');
obj.disableScreenCAP({
disableScreenCAP:false
});
Android系统
可提供的1.2.1及更高版本
设置播放器位置与尺寸(仅对iOS有效!)
setPlayerFrame({params})
x
:
y
:
w
:
h
:
var obj= api.require('polyvVideoModule');
obj.setPlayerFrame({
x: 0,
y: 20,
w: 320,
h: 320
});
iOS系统
可提供的1.0.0及更高版本
设置播放控制组件样式(已废除!)
setControlStyle({params})
controlStyle
:
none
:无播放控制组件embedded
:默认播放控制组件fullscreen
:全屏样式播放控制组件var obj= api.require('polyvVideoModule');
obj.setControlStyle({
controlStyle:'none'
});
iOS系统,1.0.0版本开始支持,1.2.0版本废除这个方法
polyvVideoDownloadModule 封装了保利威视频下载功能,支持断点下载。
通过 vid 和 指定码率(level) 创建一个视频下载器,并添加到下载列表
addDownloader({params},function(ret))
downloadArr
[
{
vid: // 字符串类型;视频 vid
level: // 数字类型;视频码率(1 为流畅,2 为高清,3 为超清;如果设置的码率不存在,就会下载默认最高清的码率)
},
{
vid: // 视频 vid
level: // 视频码率
},
...
]
{
vid0: {
downloadStatus: // 字符串类型;回调事件类型,取值范围如下:
// ready(下载器准备就绪)
// stopped (下载被停止)
// finished(下载完成)
// failed(下载失败)
// downloading(下载中)
downloadPercentage: // 数字类型,取值:0~100;当前下载进度
}, // 以 vid(字符串) 为键,下载器状态(字典)为值
vid1: {...},
...
}
{
vid0: "msg0", // 以 vid(字符串) 为键,错误信息(字符串)为值
vid1: "msg1",
...
}
var obj= api.require('polyvVideoDownloadModule');
obj.addDownloader({
downloadArr: [{
vid:'sl8da4jjbx1c8baed8a48212d735d905_s',
level:1
}]}
,function(ret,err){
for (var vid in ret){
var statusDict = ret[vid];
var downloadStatus = statusDict.downloadStatus;
alert(vid + "\n" + downloadStatus);
}
for (var vid in err){
alert(vid + "\n" + err[vid]);
}
});
iOS 系统,Android 系统
可提供的 1.0.0 及更高版本
返回下载列表,包含下载成功及下载中的视频。
getDownloadList(function(ret))
{
downloadList: [
{
vid: // 视频 vid
level: // 视频码率
},
{
vid: // 视频 vid
level: // 视频码率
},
...
]
}
var obj= api.require('polyvVideoDownloadModule');
obj.getDownloadList(function(ret, err){
var downloadList = ret.downloadList;
for (var i in downloadList){
var dict = downloadList[i];
var vid = dict.vid;
var level = dict.level;
alert(vid + " - " + level);
}
});
iOS 系统,Android 系统
可提供的 1.0.0 及更高版本
启动下载器列表中指定下载器的下载
startDownloader({params})
vid
:
var obj= api.require('polyvVideoDownloadModule');
obj.startDownloader({
vid:'sl8da4jjbx1c8baed8a48212d735d905_s'
});
iOS 系统,Android 系统
可提供的 1.0.0 及更高版本
启动下载器列表中所有下载器的下载
startALLDownloader()
var obj= api.require('polyvVideoDownloadModule');
obj.startALLDownloader();
iOS 系统,Android 系统
可提供的 1.0.0 及更高版本
停止下载器列表中指定下载器的下载
stopDownloader({params})
vid
:
var obj= api.require('polyvVideoDownloadModule');
obj.stopDownloader({
vid:'sl8da4jjbx1c8baed8a48212d735d905_s'
});
iOS 系统,Android 系统
可提供的 1.0.0 及更高版本
停止下载器列表的所有下载器的下载
stopAllDownloader()
var obj= api.require('polyvVideoDownloadModule');
obj.stopAllDownloader();
iOS 系统,Android 系统
可提供的 1.0.0 及更高版本
判断指定码率的视频是否存在(已下载)
downloadedVideoExist({params},function(ret))
vid
:
level
:
{
vid: // 字符串类型;视频vid
exist: // 布尔类型;文件存在为true,否则false
}
var obj= api.require('polyvVideoDownloadModule');
obj.downloadedVideoExist({
vid:'sl8da4jjbx1c8baed8a48212d735d905_s',
level:1
}, function(ret, err){
var vid = ret.vid;
var exist = ret.exist;
alert(vid + " ?\n" + exist);
});
iOS 系统,Android 系统
可提供的 1.0.0 及更高版本
删除指定下载视频(包含下载中视频)
deleteVideo({params})
vid
:
var obj= api.require('polyvVideoDownloadModule');
obj.deleteVideo({
vid:'sl8da4jjbx1c8baed8a48212d735d905_s'
});
iOS 系统,Android 系统
可提供的 1.0.0 及更高版本
删除所有下载视频(包含下载中视频)
deleteAllVideo()
var obj= api.require('polyvVideoDownloadModule');
obj.deleteAllVideo();
iOS 系统,Android 系统
可提供的 1.0.0 及更高版本
设置下载中(downloadStatus=downloading)回调间隔时间(秒)
setDownloadingCallbackIntervalTime({params})
seconds
:
var obj= api.require('polyvVideoDownloadModule');
obj.setDownloadingCallbackIntervalTime({
seconds:1
});
iOS 系统,Android 系统
可提供的1.0.0及更高版本
polyvVideoInfoModule 封装了获取保利威视频信息功能。
通过 vid 获取发布状态视频的时长。
getDuration({params},function(ret))
vid
{
vid: // 字符串类型;视频 vid
}
{
duration: // 数字类型;视频播放时长
}
var obj = api.require('polyvVideoInfoModule');
obj.getDuration({
vid: 'sl8da4jjbx1c8baed8a48212d735d905_s'
}, function(ret, err) {
alert("视频时长:\n" + ret.duration + "秒");
});
iOS系统,Android系统
可提供的1.0.0及更高版本
通过 vid 和指定码率(level)获取发布状态视频的文件大小。
getFileSize({params},function(ret))
vid
level
:
{
vid: // 字符串类型;视频 vid
level: // 数字类型:码率
}
{
fileSize: // 数字类型;视频文件大小(字节)
}
var obj = api.require('polyvVideoInfoModule');
obj.getFileSize({
vid: 'sl8da4jjbx1c8baed8a48212d735d905_s',
level: 1
}, function(ret, err) {
alert("文件大小:\n" + ret.fileSize + "字节");
});
iOS系统,Android系统
可提供的1.0.0及更高版本
获取视频支持码率,「1-流畅, 2-高清, 3-超清」。如返回 3,表示支持流畅、高清和超清。
getFileSize({params},function(ret))
vid
{
vid: // 字符串类型;视频 vid
}
{
levelNum: // 数字类型;视频支持码率数
}
var obj = api.require('polyvVideoInfoModule');
obj.getLevelNum({
vid: 'sl8da4jjbx1c8baed8a48212d735d905_s'
}, function(ret, err) {
alert(ret.levelNum);
});
iOS系统,Android系统
可提供的1.2.0及更高版本
Android:
iOS:
Android/iOS:
Android:
iOS:
Android:
Android:
iOS:
Android/iOS:
Android/iOS:
iOS:
Android:
iOS:
升级点播SDK到2.16.2;
修复切换外部url续播失效的问题;
Android:
升级点播SDK到2.16.2.
修复播放外部url续播不生效问题.
优化播放器体积,迁移为私有化ijk.
iOS
升级点播SDK到2.16.1;
修复播放外部url续播不生效问题;
Android:
setParam
方法的param1
参数设置。iOS:
无
Android:
无
iOS:
openMediaCodec
方法Android:
iOS:
无
Android:
无
iOS:
hideMarquee
方法Android:
iOS:
无
Android:
iOS:
Android:
iOS:
Android:
iOS:
Android:
iOS:
Android:
iOS:
升级点播 SDK 至 2.9.0
新增码率相关方法 changeLevel、getCurrentLevel、getLevelNum
支持防录屏功能
支持精准 seek
修复 open、setVid 传入非法 vid 崩溃问题
showMarquee 多次调用会生成多个跑马灯,且不再提供 hideMarquee 方法
不再提供 setControlStyle 方法