Bootstrap

2.21 live-player 与 live-pusher 组件介绍:如何在小程序中实现直播功能?(六)

视频链接:

2.21 live-player 与 live-pusher 组件介绍:如何在小程序中实现直播功能?(六)

片 1

 

上节课我们学习了同层渲染,这节课我们继续学习在小程序中如何实现直播,这是我们关于直播功能内容的最后一课。

 

上节课的最后,给你留了一个思考问题,在了解了同层渲染之后,如何在直播功能中实现全屏功能。我们一起来看一看这个问题。

 

如何实现全屏?

 

片 2

 

这是我实现的全屏效果。

 

(下面我们在手机上,查看一下两个全屏示例的运行效果)

 

现在,看一下我们的源码,在播放页这个页面,类似于上面的这个全屏效果怎么实现的?

 

exitFullScreen(){

if (this.ctx) this.ctx.exitFullScreen({

success: res => {

console.log('exitFullScreen success')

},

fail: res => {

console.log('exitFullScreen fail',res)

}

})

},

// 全屏

requestFullScreen(){

if (this.ctx) this.ctx.requestFullScreen({

success: res => {

console.log('requestFullScreen success')

},

fail: res => {

// operateLivePlayer:fail 开发者工具暂时不支持此 API 调试,请使用真机进行开发

console.log('requestFullScreen fail',res)

}

})

},

"player" style="z-index:-1;height:{{videoHeight}}px;position: fixed;width: 100%;" autoplay src="{{livePlayUrl}}" mode="live" bindstatechange="statechange" binderror="error">

text in live-player.

片 3

 

实现全屏效果,目前有两种方式,一个是把我们的原生组件,通过同层渲染,直接放在的普通组件的下方,并并使用样式,控制它全屏显示。

 

另一种方法,就是通过视频上下文对象提供的 requestFullScreen 这个方法,这个方法呢是请求应用全屏的。注意,使用这个方法全屏之后,如果还想显示一些内容,必须要写在 live-player 的标签之内。

 

我们看一下视频上下文对象 VideoContext,这个 VideoContext 实例,可以通过 wx.createVideoContext 方法获取。

 

现在我们看一下,它都有哪些方法?

 

VideoContext 对象的方法:

play() 播放视频

pause() 暂停视频

stop() 停止视频

seek(number position) 跳转到指定位置

sendDanmu(Object data) 发送弹幕

playbackRate(number rate) 设置倍速播放

requestFullScreen(Object object) 进入全屏

exitFullScreen() 退出全屏

showStatusBar() 显示状态栏

hideStatusBar() 隐藏状态栏

exitPictureInPicture() 退出小窗

片 4

 

在示例中,我们正是通过 requestFullScreen 这个方法,实现了全屏效果。

 

在全屏之后,又通过 exitFullScreen 方法,实现了退出全屏的功能。

 

通过接口开启的全屏效果,没有系统状态栏,也没有胶囊按钮,屏幕更加的纯净。另外,我们还可以使用 sendDanmu 这个方法,在这种模式下添加弹幕文字。这是它的优点。

 

在产品设计的时候,我们可以将这两种全屏效果,结合起来使用,默认情况下通过同层渲染,使 live-player 就是全屏显示的,在上面方便放置一些各种 UI 组件;同时提供一个按钮,可以进入真正全屏的清爽界面。

 

(下面我们从本课源码中,查看一下实现这个全屏效果的具体代码)

 

小窗功能

片 5

 

除了全屏功能,在这里,还有一个值得一提的在生产场景中经常使用的功能,就是小窗功能。这个功能我们在看,快手主播直播带货时,经常会看到当我们浏览快手小店的时候,直播视频是以小窗的形式出现的。

 

小窗功能,它是当你离开视频播放的页面以后,仍然可以在右下角,或者是其他地方,看到一个小视频窗口,视频播放不会因为页面的切换而停止。

 

(下面我们在手机上,查看一下这个小窗效果。这个效果也是直播组件实现的效果,必须在手机设备上才能查看)

 

Ok,这就是小窗效果。那么,这个小窗效果,在代码里是怎么实现的呢?

 

在 live-player 这个组件上,通过设置 picture-in-picture-mode 属性,可以开启小窗功能。

 

在其它页面上,可以使用 VideoContext 对象的 exitPictureInPicture 方法,可以退出小窗窗口。当然用户也可以通过单击关闭的方法,直接关闭。

 

[]

push

pop

片 6

 

那么,具体如何开启小窗呢?

 

我们可以将 live-player 组件的 picture-in-picture-mode 属性设置为["push","pop"],就可以开启小窗窗口。push ,代表向前进入新页面时,开启小窗;pop ,代表向后,退回到上一页面时,开启小窗。

 

看了全屏功能与小窗功能,这是两个在开发场景中经常用到的功能。接下来我们看一看,在开发直播功能中,经常会遇到哪些问题。

 

已经申请了工具-视频客服类目,为什么 live-player 仍然返回播放失败的错误?

片 7

 

我们先看一下这个错误信息:

 

live-player error:fail jsapi has no permission...

片 8

 

这个错误大意是讲,是没有权限。

 

成功申请小程序类目以后,并不是直接可以用了,还要在微信公共平台的后台管理页面,在「开发->接口设置」这个标签页下面,开启“实时播放音视频流”,和“实时录制音视频流”这两个开关。

 

如何动态创建 live-pusher 和 live-player 标签,如何动态修改它推流地址和拉流地址?

片 9

 

使用动态变量绑定的方法,可以实现动态创建,这是响式框架的基本功能了。关键是推流地址和拉流地址的生成。

 

播放地址结构:

rtmp://live.rixingyike.com/live/StreamName?txSecret=Md5(key+StreamName+hex(time))&txTime=hex(time)

 

var md5 = require('blueimp-md5/index')

function generatePlayUrl(domain, streamName, key, time = null){

if (!time){

time = Math.round( Date.now()/1000 )

time += 24 * 60 * 60 * 1000

}

var txTime = time.toString(16).toUpperCase()

var txSecret = md5(key+streamName+txTime);

var ext_str = `?txSecret=${txSecret}&txTime=${txTime}`

return `http://${domain}/live/${streamName}.flv${ext_str}`

}

片 10

 

在使用腾讯云的云直播功能时,为了防盗链,播放地址与推流地址都要求是动态生成的。

 

以播放地址为例,上面是生成播放地址的结构。其中 key 是我们在腾讯云网址上设置的。hex 这个操作,是16进制转化,可以直接通过 js 的 toString(16)完成。而 md5 加密,就需要我们额外安装 npm 模块了。

 

我们先通过 npm install blueimp-md5 指今,安装这个md5 模块。在安装之后,在 js 代码中,通过 require 关键字,引用这个模块。

 

以前我们安装的模块都是在 wxml 中使用的,这次是在 js 中使用的。require 的参数地址,是模块在 miniprogram_npm 这个目录下面的相对地址。

 

推流地址的生成,与播放地址是类似的。需要特别指出的是,生成播放地址与推流地址的 key,是不适合直接放在前端代码中的。一般都是放在后端,在后端生成,然后通过接口调用,传递给前端使用。我们目前的代码呢,不是这么做的,只是先给大家演示一下怎么样去生成。

 

(接下来我们从腾讯云网站上查看一下生成格式,以及在本课源码中,查看一下示例代码)

 

live-pusher 推流失败,出现 tcp channel send fail、errCode [-4]等错误,是怎么回事?

片 11

 

有时候会看到这个错误,是服务器拒绝了链接请求。

 

这个时候就要查看自己的防盗链链接,是不是写对了,核对一下算法与网站上提供的算法是不是一致。

 

可以通过 ffmpeg 或网站上提供的测试工具,对生成的推流拉流地址进行测试。一般只要能推拉流,地址就是正确的。

 

在手机上 live-pusher 和 live-player 同层渲染有时候会失效,这是怎么回事?

片 12

 

首先要查看基础库版本,是不是在 2.9.2 以上。

 

还有一点,就是在国外的渠道,目前不支持,必须是在国内渠道,同层渲染才可以开启。技术在这里有了国界之分,原因可能与专利有关,我们不去深究它。

 

同城渲染,目前在实现上,特别在 IOS 手机上,还存在一些限制和问题。最好在发生问题的原生组件上,监听 bindrendererror 事件,以便获知具体的错误信息。

 

怎么开通微信小程序直播功能?有流量费用吗?

片 13

 

我们在前面课程中,曾经提到过这个直播组件。这个功能是微信,针对电商类目小程序,在活跃经营方面表现较好的帐号,进行使用邀请的。

 

片 14

 

如果符合要求,会在小程序公众后台,在功能下面看到一个直播入口。

 

还有,只有符合直播申请资质的企业帐号,才能申请使用这个组件。

 

这个组件它本身也是基于 live-player、live-pusher 组件进行的二次封装。好处是,这个组件封闭了对直播服务器的调用,不需要自己设置,并且也没有流量费用。

 

直播时延迟太高是怎么回事?有什么办法优化?

片 15

 

延迟高,与很多方面都有关系。在播放端,要检查一下 min-cache 和 max-cache 属性,看设置的是不是太大。在推流端,查看一下网络带宽是否可以满足需求。

 

另外,腾讯云提供的推流地址,有三种协议格式:rtmp、flv 和 hls。其中 rtmp、flv 这两种协议延迟都比较低,而 hls 这种协议延迟是非常大的,延迟可以达到 20s,它不适合应用于直播场景。而 rtmp、flv 这两种协议的延迟,一般大概在 1~2s。

 

腾讯云其实还有一种更快的快直播技术,延迟大概只有 500ms。rtmp 和 flv 它们都是基于 TCP 的流媒体协议,而快直播是基于 UDP 的流媒体协议。

 

快直播:

片 16

 

上面这个呢,就是快直播的网址。

 

正常的视频流媒体,在播放时都需要向视频的前后帧做算法参考,这是视频算法为了压缩视频数据,而采取的一种有效算法机制。

 

但是如果要向后做帧面参考的话,势必要等到画面数据加载过来,这就人为造成了播放延迟。

 

快直播技术完全舍弃了,视频帧向后参考的算法,并且使用 UDP 协议进行视频流的传输,由于不需要传输确认,在传送速度上也更快了。

 

大概基于这样的原因,所以在相同的网路环境下,快直播可以比普通的直播更快,做到只有 500ms 的延迟。你如果对快直播感兴趣,可以从上面的网址中,申请使用。

 

好,这节课就讲到这里。现在关于 live-pusher、live-player 这两个组件,以及如何基于腾讯云提供的云直播功能,在小程序中实现直播,已经学习完了。下节课我们开始学习 web-view 组件,看一看能否在不审核的情况下,发布新的小程序功能页面。

 

2020 年 6 月 2 日