关于我在uni-app练手中遇到的坑

news2024/11/18 19:27:27

目录

页面层级结构的加载和回退

filePath编码

对象的深度克隆

弹幕的加载

​编辑 

uni-app内置浏览器加载视频失败

后台报错 java.io.IOException: 你的主机中的软件中止了一个已建立的连接

 安卓里遍历uni-list-item错误

 手机自带浏览器无法加载视频

乱码问题

video中initial-time失效

手动设置视频初始时间

video的@progress失效

视频播放结束后,不能直接设置历史记录为结束时间

mybatis中关联查询

代码


       

前几周一直在用uni-app练手,于是乎写了一个视频播放器,从一开始粗糙版,到加入了数据库后的简易版。

        其中记录一下坑。

        代码的话已经提交到github,可能后续还会维护下去,看自己有什么好的想法吧。

        

页面层级结构的加载和回退

如图所示,在在加载数据后,进入第二层,第三层目录后,如何回退到父级目录。

这里就考虑一个数据接口,栈,先进后出。

页面中定义一个parentDir: [],

filePath编码

如果是运行在安卓手机中当app,则window.encodeURI是无效的,所以需要使用

this.nowFilePath = encodeURIComponent(this.nowFilePath);

对象的深度克隆

将一个object对象push到栈中时,加入的仅仅是这个对象的引用,改变了对象引用,栈里面的指向也会改变,所以需要深度克隆。

弹幕的加载

在页面上可以看到danmuList是一个数组,从后台请求这个视频的弹幕信息,而如果没有这个v-if的话,弹幕是不会展示的。

因为页面video组件已经加载完成,此时即使加载了弹幕数据,也压根无用。

 所以才需要在获取数据后展示video组件,如此加载弹幕。

uni-app内置浏览器加载视频失败

官网有说明,所以如果是调试,可以运行到chrome等浏览器

后台报错 java.io.IOException: 你的主机中的软件中止了一个已建立的连接

        此问题尚未真正解决 

这种有两种情况,第一种是视频的编码不符合video的编码格式。

HTML <video> 标签 | 菜鸟教程

所以如果不符合上述三种格式的,就需要使用代码转变格式。

com.lw.familysystem.video.VideoUtils#encode

第二中情况是视频流的跨域问题,

com.lw.familysystem.video.VideoService#playVideo

直接在此方法中加入允许跨域请求,

response.addHeader("Access-Contro1-A11ow-0rigin","*");

后记:其实还是会经常出现这个问题,但是不影响播放。

 安卓里遍历uni-list-item错误

<uni-list-item v-for="(item,index) in directories.childDirList" :key="item.filePath" :title="item.name"

note="目录"

thumb="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png"

thumb-size="lg" rightText="点击进入" clickable link @click="toNext(item,index)"></uni-list-item>

在chrome中上述代码没问题,但是运行到手机中,就会出现,

TypeError: Invalid attempt to destructure non-iterable instance.

In order to be iterable, non-array objects must have a [Symbol.iterator]() method. at view.umd.min.js:1

 手机自带浏览器无法加载视频

这个问题暂时还没解决,换了手机里的chrome浏览器后,访问地址能加载视频。 

乱码问题

路径变成了ascii码,统一编码。

其实最好路径不要用中文,就不会有乱码。

 上述使用的是tag  V0.0.2中代码遇到的坑。

video中initial-time失效

猜测应该是只有当video第一次初始化,然后加载视频时有用,而我获取视频是在onLoad中加载视频,而video组件出现是在onShow中。

onLoad中请求后台视频数据时,video可能已经在页面加载,而此时还没有设置url,导致视频会出现加载失败,此时initial-time自然无效。

当onLoad中请求了视频数据后,给video设置了url后,虽然能播放后台数据,但此时initial-time已经没有效果了。

经验证,上述猜测错误,真正原因是在playVideo方法中,将response的返回状态码设置为200,而不是206。

返回206是客户端表明自己只需要目标URL上的部分资源的时候返回的,比如video组件只需要先知道视频的长度,而不需要全部加载视频。

而200则让完全加载视频信息等。

//返回码需要为206,而不是200
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);

手动设置视频初始时间

不可能每次都调整initial-time,所以需要手动设置,就需要使用到uni.createVideoContext创建的对象了。

所以就需要用到 videoContext.seek()方法了,

getVideoHistoryM() {
	var param = {
		loginName: this.loginName,
		videoId: this.videos[this.nowPlayIndex].videoId
	}
	getVideoHistory(param).then(res => {
		if (res?.result_code == "0") {
			if (res.data) {
				var history = res.data;
				this.startTime = history.playTime;
				this.videoContext.seek(this.startTime); //跳转到指定秒		
			}
		}
	});
},

video的@progress失效

当视频播放完后,一轮循环已经结束,再自动从头开始播放第一集的时候,此时并不会再进入@progress中的方法,所以就需要在@loadedmetadata 中的方法里判断下。

loadedMetaData(e) {//视频加载完毕
	const {
		duration
	} = e.detail
	// 记录视频总时间
	this.duration = duration
	if(!this.autoPlaying){
		if(!this.firstVideo){//非第一个视频,自动播放
			this.play();
		}
	}
	this.videoContext.playbackRate(1.5);
},
onProgressVideo(e){
	const {buffered} = e.detail;
	console.log(buffered)
	if(buffered>4){//视频加载了百分之 就自动播放
		if(!this.firstVideo){//非第一个视频,自动播放
			this.play();
		}
	}
},

视频播放结束后,不能直接设置历史记录为结束时间

比如,有个视频,时长18秒,再timeUpdate方法中监测到播放结束时,需要保存历史记录,那么此时不能保存为18秒,否则,下一刻再次点击这个视频时,就自动定位到18秒,然后跳转到下一个视频了,就永远也看不了这个视频了。

//播放结束后保存历史记录

this.currentPlayTime = 0;

this.savePlayHistoryM()

所以直接将当前时间重置,那么下次就是重头开始播放了。

mybatis中关联查询

left join 了多个表,需要将连接表的内容放入组合的vo中。如下所示,返回的Vo中内联了两个vo。

@Data
public class VideoPlayHistoryVo extends VideoPlayHistory {

    private String createTimeFmt;
    private String updateTimeFmt;

    private VideoPhysicsInfoVo videoPhysicsInfoVo;
    private VideoInfoVo videoInfoVo;
}

在xml中也需要编写内联的,association的property值要和VideoPlayHistoryVo中的内联名字相同。

<resultMap id="videoHistoryVoResultMap" type="com.lw.familysystem.vo.VideoPlayHistoryVo">
    <id property="historyId" column="history_id"/>
    <result property="videoId" column="video_id"/>
    <result property="accountName" column="account_name"/>
    <result property="playTime" column="play_time"/>
    <result property="playTimeVis" column="play_time_vis"/>
    <result property="createTimeFmt" column="create_time_fmt"/>
    <result property="updateTimeFmt" column="update_time_fmt"/>
    <result property="createTime" column="create_time"/>
    <result property="updateTime" column="update_time"/>
    
    <association property="videoPhysicsInfoVo" javaType="VideoPhysicsInfoVo">
        <id property="videoId" column="video_id"/>
        <result property="videoName" column="video_name"/>
        <result property="infoId" column="info_id"/>
        <result property="orderNo" column="order_no"/>
        <result property="quarterInfo" column="quarter_info"/>
        <result property="relativePath" column="relative_path"/>
        <result property="createTimeFmt" column="create_time_fmt"/>
        <result property="updateTimeFmt" column="update_time_fmt"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
    </association>

    <association property="videoInfoVo" javaType="VideoInfoVo">
        <id property="infoId" column="info_id"/>
        <result property="videoName" column="info_name"/>
        <result property="videoType" column="video_type"/>
        <result property="orderNo" column="order_no"/>
        <result property="categoryId" column="category_id"/>
        <result property="relativePath" column="relative_path"/>
        <result property="createTimeFmt" column="create_time_fmt"/>
        <result property="updateTimeFmt" column="update_time_fmt"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
    </association>
    
</resultMap>

在页面上就如下这样使用,例子可以看mine.vue

<uni-list-item v-for="(history,index) in histories" :key="index" :title="history.videoPhysicsInfoVo.videoName"

:note="history.videoInfoVo.videoName"

:rightText="''+history.playTimeVis" clickable link

@click="toPlayVideoPage(history.videoPhysicsInfoVo.infoId,history.videoPhysicsInfoVo.videoId)">

</uni-list-item>

        上述问题是 tag V0.0.3遇到的问题

代码

后端

前端

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/29708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

陆地卫星计划:卫星图像数据和波段介绍

陆地卫星计划&#xff1a;卫星图像数据和波段 学分&#xff1a;美国地质调查局&#xff08;地球上陆地卫星8号图解&#xff09; 陆地卫星项目&#xff1a;超过40年的图像采集 想象一下&#xff0c;能够在任何给定的地点&#xff0c;在任何给定的时间回顾四十年&#xff0c;并…

操作系统之内存管理

文章目录一、 虚拟内存二、内存分段三、内存分页多级页表TLB四、段页式内存管理五、Linux 内存管理一、 虚拟内存 单片机是没有操作系统的&#xff0c;所以每次写完代码&#xff0c;都需要借助工具把程序烧录进去&#xff0c;这样程序才能跑起来。 另外&#xff0c;单片机的 C…

基于单片机的出租车计价器设计

✅作者简介&#xff1a;嵌入式领域优质创作者&#xff0c;博客专家 ✨个人主页&#xff1a;咸鱼弟 &#x1f525; 系列专栏&#xff1a;单片机设计专栏 &#x1f4c3;推荐一款求职面试、刷题神器&#x1f449;注册免费刷题 一、主要功能 本课程设计所设计的出租车计价器的主要功…

python数据结构 操作指南(列表、元组、字典、集合)

数据结构是在python程序运行中必不可少的一部分&#xff0c;在深度学习应用&#xff0c;更是常用来存储模型输出的信息&#xff0c;小编在深度学习开发中过程中&#xff0c;发现有时候我们需要对数据结构中存储的信息&#xff0c;进行复合的条件的筛选&#xff0c;并返回特定的…

python高阶函数心得笔记,python高阶函数知识

递归函数 <1>什么是递归函数 通过前面的学习知道一个函数可以调用其他函数。 如果一个函数在内部不调用其它的函数&#xff0c;而是自己本身的话&#xff0c;这个函数就是递归函数。 <2>递归函数的作用 举个例子&#xff0c;我们来计算阶乘 n! 1 * 2 * 3 * .…

python 绘制BA图, 绘制Bland-Altman, 两个连续变量的一致性分析

一致性分析 分析数据一致性时常用的方法如下&#xff1a; 方法数据类型ICC组内相关系数定量或者定类Kappda一致性系数定类&#xff08;分级&#xff09;Bland-Altman图&#xff08;BA图&#xff09;定量数据 Bland-Altman 常用于生物医学研究论文中评价 两种连续变量测量方法…

MySQL MVCC工作原理

之前的文章中我们讲到&#xff0c;MySQL事务的隔离级别有四种分别是&#xff1a;read uncommitted、read committed、repeatable read和serializable。现在InnoDB下默认的存储引擎是repeatable read&#xff0c;之前也提过在repeatable read下MySQL是通过MVCC来解决幻读的问题。…

Dubbo服务调用扩展点Filter的介绍与使用

扩展点介绍 如上图所示&#xff0c;从服务调用的角度来看&#xff0c;Dubbo 在链路中提供了丰富的扩展点&#xff0c;覆盖了负载均衡方式、选址前后的拦截器、服务端处理拦截器等。 简单来说 Dubbo 发起远程调用的时候&#xff0c;主要工作流程可以分为消费端和服务端两个部分。…

Linux网络--------http协议

文章目录URL---网址对http协议的宏观认识http协议的请求方法http响应的状态码最简单的http协议服务器关于http协议的一些概念性知识URL—网址 首先&#xff0c;http协议是应用层协议&#xff0c; 是超文本传输协议。 urlencode : 转码 urldecode &#xff1a; 解码 将 ---- …

python自学入门(打卡十)2022-11-22

Pytest与Unittest区别 参考资料&#xff1a;https://blog.csdn.net/qq_33385691/article/details/112004487 pytest用例规则 文件名以test_.py文件和test.py 以test_开头的函数 以Test开头的类&#xff0c;test_开头的方法&#xff0c;并且不能带有__init_ 方法 所有的包pake…

极智AI | 昇腾开发环境搭建 CANN MindStudio (无坑版)

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多笔记分享 大家好&#xff0c;我是极智视界&#xff0c;本文介绍一下 昇腾开发环境搭建 CANN & MindStudio&#xff0c;没有坑。 本文介绍的方法适用于&#xff1a; 系统&#xff1a;ubuntu18.04 (注&#xff1a;[ce…

5个常见的JavaScript内存错误

JavaScript 不提供任何内存管理操作。相反&#xff0c;内存由 JavaScript VM 通过内存回收过程管理&#xff0c;该过程称为垃圾收集。 既然我们不能强制的垃圾回收&#xff0c;那我们怎么知道它能正常工作&#xff1f;我们对它又了解多少呢&#xff1f; 脚本执行在此过程中暂停…

计算机毕业设计之java+ssm某地区精准扶贫网站

项目介绍 本精准扶贫网站管理系统主要包括系统用户管理模块、捐赠信息管理模块、投诉信息管理、扶贫资讯管理、登录模块、和退出模块等多个模块,系统采用了jsp的mvc框架,SSM(springMvcspringMybatis)框架进行开发,本系统使用mysql&#xff0c;独立运行,不依附于其他系统&#…

Redis数据类型之set

文章目录setⅠ. 基础操作Ⅱ. 随机数据Ⅲ. 交、并、差Ⅳ. 应用场景Ⅴ. 注意事项提示&#xff1a;以下是本篇文章正文内容&#xff0c;Redis系列学习将会持续更新 set ● 数据存储需求&#xff1a;存储大量的数据&#xff0c;在查询方面提供更高的效率。 ● 需要的存储结构&#…

家乡主题网页设计代码 旅游主题网页设计 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

详细解读Spring Boot中@Import三种使用方式

需要注意的是&#xff1a;ImportSelector、ImportBeanDefinitionRegistrar这两个接口都必须依赖于Import一起使用&#xff0c;而Import可以单独使用。Import是一个非常有用的注解&#xff0c;它的长处在于你可以通过配置来控制是否注入该Bean&#xff0c;也可以通过条件来控制注…

CNN卷积神经网络

&#xff08;声明&#xff1a;本文章是在学习他人视频的学习笔记&#xff0c;图片出处均来自该up主&#xff0c;侵权删 up主链接&#xff1a;同济子豪兄的个人空间_哔哩哔哩_bilibili&#xff09; 卷积神经网络就像一个黑箱&#xff0c;有输入和输出&#xff0c;输入是一个图像…

Spring 中更加简单的 “存储“ 和 “读取“ 对象

目录 1. 更加简单的存储对象 1.1 配置扫描路径 1.2 使用五大类注解存储 bean 对象 1.2.1 五大类注解之间的关系 1.2.2 关于 bean 的命名规则 1.3 使用方法注解存储 bean 对象 1.3.1 bean 的重命名 2. 更加简单的获取对象 (DI) 2.1 属性注入 2.1.1 属性注入优缺点分析 …

三、图片的几何变换

目录一、图片缩放1 - 等比缩放2 - 最近领域插值3 - 双线性插值4 - 矩阵缩放二、图片剪切与位移1 - 图片剪切2 - 图片位移三、图片镜像四、图片仿射变换五、图片旋转一、图片缩放 1 - 等比缩放 # 1 load 2 info 3 resize 4 check import cv2img cv2.imread(image0.jpg, 1) im…

软件工程详细知识点复习(上)

文章目录一、软件工程概述1、软件与软件危机2、软件工程二、可行性研究三、需求分析四、概要设计五、详细设计一、软件工程概述 1、软件与软件危机 软件程序数据文档 1、软件危机的主要表现 软件不能满足用户需求软件开发成本严重超标&#xff0c;开发周期大大超过规定日期…