live-player
解释:实时视频播放
只针对直播答题、直播服务类目开放。需要先通过类目审核,再在小程序管理后台,“设置”-“接口设置”中自助开通该组件权限。
一级类目 | 二级类目 |
---|---|
娱乐 | 直播、直播答题 |
属性说明:
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
id | String | - | live-player 属性的唯一标志符 |
src | String | - | 音视频地址。目前仅支持 m3u8 格式 |
autoplay | Boolean | false | 自动播放 |
muted | Boolean | false | 是否静音 |
orientation | String | vertical | 画面方向,可选值有 vertical,horizontal,目前仅支持安卓端使用该属性。 |
object-fit | String | contain | 填充模式,可选值:contain、fillCrop |
background-mute | Boolean | false | 进入后台时是否静音 |
min-cache | Number | 1 | 最小缓冲区,单位s |
max-cache | Number | 3 | 最大缓冲区,单位s |
bindstatechange | EventHandle | - | 播放状态变化事件,detail = {code} |
bindnetstatus | EventHandle | - | 网络状态通知,detail = {info} |
bindfullscreenchange | EventHandle | - | 全屏变化事件,detail = {direction, fullScreen}。 |
说明:
- live-player 默认宽度 300px、高度 225px;
- 从基础库版本1.12.0开始支持事件捕获、冒泡。
状态码
代码 | 说明 |
---|---|
2001 | 已经连接服务器 |
2002 | 已经连接服务器,开始拉流 |
2003 | 网络接收到首个视频数据包(IDR) |
2004 | 视频播放开始 |
2005 | 视频播放进度 |
2006 | 视频播放结束 |
2007 | 视频播放Loading |
2008 | 解码器启动 |
2009 | 视频分辨率改变 |
-2301 | 网络断连,且经多次重连抢救无效,更多重试请自行重启播放 |
-2302 | 获取加速拉流地址失败 |
2101 | 当前视频帧解码失败 |
2102 | 当前音频帧解码失败 |
2103 | 网络断连, 已启动自动重连 |
2104 | 网络来包不稳:可能是下行带宽不足,或由于主播端出流不均匀 |
2105 | 当前视频播放出现卡顿 |
2106 | 硬解启动失败,采用软解 |
2107 | 当前视频帧不连续,可能丢帧 |
2108 | 当前流硬解第一个I帧失败,SDK自动切软解 |
3001 | RTMP -DNS解析失败 |
3002 | RTMP服务器连接失败 |
3003 | RTMP服务器握手失败 |
3005 | RTMP 读/写失败 |
网络状态数据:
键名 | 说明 |
---|---|
videoBitrate | 当前视频编/码器输出的比特率,单位 kbps |
audioBitrate | 当前音频编/码器输出的比特率,单位 kbps |
videoFPS | 当前视频帧率 |
videoGOP | 当前视频 GOP,也就是每两个关键帧(I帧)间隔时长,单位 s (安卓不支持该键名) |
netSpeed | 当前的发送/接收速度 |
netStatus | 网络状态:-1为未知;0为网络不可用;1为无线广域网连接;2为WiFi连接 。(安卓不支持该键名) |
videoWidth | 视频画面的宽度 |
videoHeight | 视频画面的高度 |
示例:
- .wrap {
position: relative;
top: 10px;
width: 100%;
}
.item {
display: block;
margin: 6px 22.67px;
border-radius: 4px;
height: 38px;
line-height: 38px;
font-size: 18px;
text-align: center;
text-decoration: none;
overflow: hidden;
box-sizing: border-box;
color: #333;
border: 1px solid #333;
background-color: #fff;
}
- <live-player id="myLive" src="{{src}}" autoplay="{{autoplay}}" object-fit="{{objectFit}}" background-mute="{{backgroundMute}}" muted="{{muted}}" min-cache="{{minCache}}" max-cache="{{maxCache}}" bind:statechange="statechange" bind:netstatus="netstatus"></live-player>
<div class="wrap">
<view class="item" bind:tap="livePlay">开始播放 play</view>
<view class="item" bind:tap="liveStop">停止播放 stop</view>
<view class="item" bind:tap="liveMute">静音</view>
<view class="item" bind:tap="changeSrc">更换src</view>
<view class="item" bind:tap="backgroundMute">后台静音</view>
<view class="item" bind:tap="objectFit">object-fit改变</view>
<view class="item" bind:tap="oneItemClick">点击跳转</view>
</div>
- Page({
data: {
cur: 0,
src: 'http://livebd.quanmin.tv/live/1931315320.m3u8',
srcList: [
'http://livebd.quanmin.tv/live/1931315320.m3u8',
'http://livebd.quanmin.tv/live/462099.m3u8',
],
objectFit: 'contain',
orientation: 'vertical',
minCache: 1,
maxCache: 3,
muted: false,
backgroundMute: false
},
onReady(e) {
this.ctx = swan.createLivePlayerContext('myLive');
},
statechange(e) {
swan.showToast({
title: '播放状态变化 statechange' + JSON.stringify(e)
});
},
netstatus(e) {
swan.showToast({
title: '网络状态变化 netstatus' + JSON.stringify(e)
});
},
livePlay(e) {
this.ctx.play();
},
objectFit(e) {
this.setData('objectFit', this.getData('objectFit') === 'contain' ? 'fillCrop' : 'contain');
},
liveStop(e) {
this.ctx.stop();
},
liveMute(e) {
let muted = !this.getData('muted');
this.setData('muted', muted);
},
changeSrc(e) {
let srcList = this.getData('srcList');
let cur = (this.getData('cur') + 1) % srcList.length;
this.setData('src', srcList[cur]);
this.setData('cur', cur);
},
backgroundMute(e) {
this.setData('backgroundMute', !this.getData('backgroundMute'));
},
oneItemClick(e) {
swan.navigateTo({
url: 'pages/live-player-new/live-player-new'
});
}
});