live-player

解释:实时视频播放

只针对直播答题、直播服务类目开放。需要先通过类目审核,再在小程序管理后台,“设置”-“接口设置”中自助开通该组件权限。
一级类目二级类目
娱乐直播、直播答题

属性说明:

属性名类型默认值说明
idString-live-player 属性的唯一标志符
srcString-音视频地址。目前仅支持 m3u8 格式
autoplayBooleanfalse自动播放
mutedBooleanfalse是否静音
orientationStringvertical画面方向,可选值有 vertical,horizontal,目前仅支持安卓端使用该属性。
object-fitStringcontain填充模式,可选值:contain、fillCrop
background-muteBooleanfalse进入后台时是否静音
min-cacheNumber1最小缓冲区,单位s
max-cacheNumber3最大缓冲区,单位s
bindstatechangeEventHandle-播放状态变化事件,detail = {code}
bindnetstatusEventHandle-网络状态通知,detail = {info}
bindfullscreenchangeEventHandle-全屏变化事件,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自动切软解
3001RTMP -DNS解析失败
3002RTMP服务器连接失败
3003RTMP服务器握手失败
3005RTMP 读/写失败

网络状态数据:

键名说明
videoBitrate当前视频编/码器输出的比特率,单位 kbps
audioBitrate当前音频编/码器输出的比特率,单位 kbps
videoFPS当前视频帧率
videoGOP当前视频 GOP,也就是每两个关键帧(I帧)间隔时长,单位 s (安卓不支持该键名)
netSpeed当前的发送/接收速度
netStatus网络状态:-1为未知;0为网络不可用;1为无线广域网连接;2为WiFi连接 。(安卓不支持该键名)
videoWidth视频画面的宽度
videoHeight视频画面的高度

示例:

在开发者工具中预览效果

  1. .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;
    }

  1. <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>

  1. 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'
    });
    }
    });

导航地图