赞
踩
我这边的想要的是自定义绘制视频界面,这样做的话就需要将video原有的control相关的功能重写(播放、暂停、快进、快退、全屏、音量等),全屏和非全屏两套样式,通过官方提供的uni.createVideoContext(videoId, this)可以获取到video的实例,然后通过实例调用video的api,比如play、pause等。
最终我这边实现后的播放器支持以下功能:
这里注意的一点是path路径是从根目录开始的,不是对应的父窗体的相对路径。
文件格式一定是要nvue格式。
配置完之后子窗体就会在对应的页面上显示。
全屏和非全屏后界面有些许差异,比如全屏后才可以选集等其他功能,那需要设计出两套样式。
通过ref拿到video实例
videoCTX = this.$refs.video
全屏和取消全屏事件
// 全屏/退出全屏
fullOrExitScreen() {
if (this.fullScreenStatus) {
videoCTX.exitFullScreen()
} else {
videoCTX.requestFullScreen()
}
},
手势操作分为向上向下向左向右四个方位
touchStart时存储首次的坐标点
this.oldTouchs = e.changedTouches[0]
我这边定义的touchType为三种类型,currentTime进度、luminance亮度、volume音量
然后再touchEnd设置video进度
下面是SRT原格式
通过以下函数将数据转换为数组
createSrtArr(srt) { let arr = srt.split(/\n\n|\r\r|\r\n\r\n/) let result = [] arr.forEach(item => { let srtObj = {} let containArr = item.split(/\n/) if (containArr[1]) { //此处正则用于取出00:00:00,213 --> 00:00:00,213这种结构,防止可能存在于此行的x,y坐标对后续处理造成影响 var reg = /^(\d{2}):(\d{2}):(\d{2})[\.,](\d{1,3}) --\> (\d{2}):(\d{2}):(\d{2})[\.,](\d{1,3})/g let regResult = reg.exec(containArr[1]) if (regResult) { let timeSplit = regResult[0].split(' --> ') srtObj.from = this.getSeconds(timeSplit[0]) srtObj.to = this.getSeconds(timeSplit[1]) //这里的两个replace主要是将srt中可能携带的font标签转化为易用的span,当时遇到了如果是font标签的话没办法继承父元素的字体大小的问题,题外话:本次字母字体大小采用了媒体查询进行设置 srtObj.htmlText = containArr.slice(2).join(`\n`).replace(/\<font/g, '<span').replace(/\<\/font/g, '</span') result.push(srtObj) } } }) return result }
转换后的数据格式如下
getSubtitle(currentTime, arr) {
let left = 0;
let right = arr.length - 1;
while (left <= right) {
let mid = Math.floor((left + right) / 2);
if (currentTime >= arr[mid].from && currentTime <= arr[mid].to) {
return arr[mid].htmlText;
} else if (currentTime < arr[mid].from) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return null; // 如果未找到匹配的时间段,则返回null或者其他您认为合适的值
}
PS: 这个里有注意事项,因为我这边是需要兼容h5和app端,通过时长获取到的字幕数据有可能携带标签,所以需要富文本展示,h5和app上均需要做处理。
<!-- #ifdef H5 -->
<view class="subtitles" v-html='subtitles'></view>
<!-- #endif -->
<!-- #ifdef APP-PLUS -->
<rich-text class="subtitles" :nodes="nodes" :style="videoBox">
<!-- #endif -->
</rich-text>
const res = this.getSubtitle(value,this.subtitlesArray) || ''
if (this.subtitlesArray.length) {
// #ifdef APP-PLUS
this.nodes[0].children[0].text =res
// #endif
// #ifdef H5
this.subtitles = res
// #endif
}
这里先简单记录下,因为时间有限,代码已上传到线上,有需要的伙伴可以下载下来参考下。传送门
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。