【移动端html5】 android video播放进度精确控制

android上视频播放存在的问题

在PC上播放html5视频,设置video.currentTime=5,视频将跳到5s的位置,并且显示出第5s的画面。在安卓下,却存在下面两个问题:

  • 在安卓上,为了省电,在暂停的时候,改变视频属性不会刷新画面,直到你再次播放的时候,这些改变才会表现出来。所以暂停的时候改变currentTime不会更新画面,手动改变进度条也不行。
  • 在安卓上,视频并不是准确的按currentTime播放,可能你设置 currentTime = 5,但是播放出来的内容却是第8s的。这个问题,用手改变进度条也会出现,可以将视频拖到60s,在拖回10s,看看播放的内容是否是第10s的。

所以,对于一些需要精确控制视频进度的情景,比如视频演示,这两个问题会造成很大的困扰,因为android下,没有办法很精确的控制视频进度。

可能并不是所有移动端都存在这两个问题,没验证哪些存在

解决办法

对于第二个问题,是没有办法改变的,这是html5 video的实现问题。但是第一个问题,却可以通过模拟“暂停下设置视频进度”解决。

模拟的方式是,先播放视频,然后将视频设置到目标时间,当视频加载出第一帧的时候,暂停视频,如下:

  1. 播放视频,监听playing事件

  2. 触发playing事件,说明视频已经开始播放,此时设置currentTime等于目标时间,监听seeked事件

  3. 触发seeked事件,在移动端下,seeked事件触发后,表示已经寻址到了指定时间,但是画面还没更新,监听timeupdate事件

  4. 触发timeupdate事件,在移动端下,第一次触发这个事件表示即将更新画面,此时设置50ms的延迟,因为一般视频为24fps,也就是40ms刷新一帧,50ms的延迟为了确保第一帧加载出来

  5. 延迟结束,暂停视频。此时视频暂停再目标时间,画面也已经加载出来。

之所以要搞得这么复杂,是因为在android下,事件触发并不是很准确,经触发了playingtimeupdate事件,但视频可能都还没开始播放,但是有这么几个规律:

  • 第一,触发seeked之后的timeupdate的时候,视频已经很接近播放了
  • 第二,触发playing后,第2次触发timeupdate的时候一定已经播放着了,但是触发两次timeupdate的间隔比较大,往往视频已经很明显的播放一小段。

并非放之四海皆准的规律

下面的代码就是用这种方式实现的,能够在android上暂停时设置currentTime,主要看setTime方法:

 /*** Created by Administrator on 2017/1/9.*/
export default class Video{constructor(src){let uid = new Date().getTime();this.id = 'video'+uid;this.video = $(`<video id="${this.id}"></video>`).get(0);this.status = null; //播放状态}play(){this.status = "playing";this.video.play();return this;}pause(){this.status = "paused";this.video.pause();return this;}/*** 设置视频当前的事件* @param time 时间* @returns {Number}*/setTime(time){if(this.status == "playing"){this.video.currentTime = time;console.log("当前视频时间:"+this.video.currentTime);return time;}/*目的:在移动端下加载指定时长的视频画面移动端下存在的问题:在移动端下,如果不播放视频,则视频控件显示黑屏,此时不可指定视频当前时间解决办法:在移动端下,设置到指定时长后,播放极小的一段时间,让视频控件显示出当前的画面,然后暂停,看起来就像直接指定时间一样实现说明:1、监听playing事件,并在其中监听seeked和timeupdate事件,两个事件都触发后,视频一般接近或已经开始播放了,然后再设置50ms的延迟,一般可保证视频播放2、在setTime执行的过程中,有可能外部已经更改了视频播放的状态(通过调用this.play()或this.pause()),因此设置一个status字段,保存外部的操作*/let that = this;that.video.play();$(that.video).one("playing",function(){that.video.currentTime = time;$(that.video).one("seeked",function(){$(that.video).one("timeupdate",function(){clearTimeout(that.timeout);that.timeout = setTimeout(()=>{console.log("当前视频时间:"+that.video.currentTime);if(that.status == "playing"){that.video.play();}else{that.video.pause();}},that.delay);});})})return time;}}

一些链接

video标签在不同平台上的事件表现差异分析

Jumping to time offsets in HTML5 video

移动端HTML5视频播放优化实践

html5 video seekable属性

【W3C】 HTML DOM Video 对象

【MDN】video标签

视频播放的那些事

html5–移动端视频video的android兼容,去除播放控件、全屏等

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

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

相关文章

柯理化

在JS中柯里化就是把一个需要传入多个参数的函数变成多个嵌套的只要传入一个参数的函数 在普通函数中的柯理化&#xff1a; var addfunction(x,y){ return xy; } 柯里化&#xff1a; var addCurringfunction(x){ return function(y){ return xy; } } addCurring(1)(2);//3 如果是…

Java NIO 教程

NIO 概述 NIO有三个核心组件&#xff1a; 通道&#xff08;Channels&#xff09;缓冲器&#xff08;Buffers&#xff09;选择器&#xff08;Selectors&#xff09; 实际上&#xff0c;NIO的组件和类远不止这三个&#xff0c;但这个三个组件是核心。至于其它组件&#xff0c;…

threejs相机和渲染器

渲染器 渲染器其实代表的是canvas标签。 渲染器的类型 WebGLRender 使用WebGL来渲染图形&#xff0c;速度较快&#xff0c;但是有些机器不支持WebGL。 CanvasRender 使用canvas2d来渲染图形&#xff0c;在较老的版本上&#xff0c;主要是用来渲染2D图形。现在这个渲染器在…

类的 三大特性 封装,继承,多态 overload与override的区别

OOP三大特性&#xff1a;封装&#xff0c;继承&#xff0c;多态 封装的目的&#xff1a;为了让类更安全封装的做法&#xff1a;1.类里面的成员变量做为private2.使用成员方法来间接访问成员变量3.在该方法里面加限制条件 php类里面不允许出现同名方法 继承 概念&#xff1a;子类…

三级菜单 python_python三级菜单

menu {北京:{海淀:{五道口:{soho:{},网易:{},google:{}},中关村:{爱奇艺:{},汽车之家:{},youku:{},},上地:{百度:{},},},昌平:{沙河:{老男孩:{},北航:{},},天通苑:{},回龙观:{},},朝阳:{},东城:{},},上海:{闵行:{"人民广场":{炸鸡店:{}}},闸北:{火车战:{携程:{}}},浦…

threejs概览

threejs术语和概念 threejs的API很长&#xff0c;有很多概念和术语&#xff0c;理解了这些概念和术语&#xff0c;才能更好的使用threejs。这些概念和术语都藏在API右侧的大纲中&#xff0c;下图简单整理了一下这些概念&#xff1a; 这些概念又分为四个大类&#xff08;见上图…

C#生成新浪微博短网址 示例源码

using System;using System.Collections.Generic;using System.Linq;using System.Text;using DotNetSample.Models;using System.Web.Script.Serialization;namespace DotNetSample.Utils{public class ShortUrlHelper{/// <summary>/// 获取新浪短域名/// </summary…

leetcode数组汇总_[LeetCode] 300. 最长上升子序列

题目链接&#xff1a; https://leetcode-cn.com/problems/longest-increasing-subsequence难度&#xff1a;中等通过率&#xff1a;43.0%题目描述:给定一个无序的整数数组&#xff0c;找到其中最长上升子序列的长度。示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释:…

threejs创建平面几何形状

创建平面几何形状 平面几何形状有三种&#xff1a;点&#xff0c;线&#xff0c;面三种&#xff0c;下面说说用threejs创建这几种形状的方法。 创建点 创建点可以使用Points类。 function createPoints(){//创建一个Geometry&#xff0c;并添加点let geometry new THREE.G…

新建vue3项目(未完待续)

vite 官网 https://cn.vitejs.dev/ 使用 vite 创建项目 npm create vitelatest 进入目录后 执行 npm install 运行程序 npm run dev vscode 不要同时安装 vetur 和 volar 关于安装eslint 官网 &#xff1a;https://eslint.org 安装ESLINT npm install eslint …

wcf 返回图片_wcf http 返回图片

做项目时候用wcf 返回图片,从官网上找了找一次只能返回一张图片&#xff0c;但是一直查不到返回多个图片的方法&#xff0c;ios 可以异步加载看速度也可以&#xff0c;先记录一下等以后用解决了再发[ServiceContract]public interface IImageServer{[OperationContract, WebGet…

threejs精灵(Sprite)

Sprite精灵 Sprite叫精灵&#xff0c;计算机图形学中&#xff0c;精灵指包含于场景中的二维图像或动画&#xff08;wiki&#xff09;。在threejs中&#xff0c;这样说明Sprtite&#xff08;doc&#xff09; : A sprite is a plane that always faces towards the camera , ge…

Ubuntu更改鼠标灵敏度

需要命令:xinput 清自行用 man xinput 查询 xinput 帮助文档 1、插入鼠标&#xff0c;打开终端&#xff0c;输入命令&#xff1a;xinput 查询当前已挂在设备 2、拔出鼠标&#xff0c;打开终端&#xff0c;再输入命令&#xff1a;xinput 查询当前已挂在设备&#xff0c;发现缺少…

echarts 生成 迁徙图_echarts3 迁徙图 迁入迁出(示例代码)

geoCoordMap {‘上海‘: [121.4648,31.2891],‘佛山‘: [112.8955,23.1097],‘保定‘: [115.0488,39.0948],‘兰州‘: [103.5901,36.3043],‘包头‘: [110.3467,41.4899],‘北京‘: [116.4551,40.2539],‘天津‘: [117.4219,39.4189],‘常州‘: [119.4543,31.5582],‘广州‘: […

threejs骨架形状

骨骼动画 骨骼是什么&#xff1f;骨骼就是一个可以控制其它形状的对象。在threejs中&#xff0c;骨骼&#xff08;Bone&#xff09;就是一个空的Object3D对象&#xff0c;当然&#xff0c;也可以是任何Object3D对象的子类。 创建骨架 创建骨架总体来说就四步&#xff1a; 创…

.net 知识积累

日历模式&#xff1a; 可以使用按钮事件进行触发 &#xff1b; 设置默认按钮&#xff1a; this.Form.DefaultButton"ID属性" &#xff1b; 注意此功能只能应用于.net控键中&#xff0c;必须位于 ruant "Server"; DefaultButton 必须是 IButtonControl 类…

tx2无法识别网络_Jetson TX2开篇--网络配置

续接上文&#xff0c;硬件连接完毕后&#xff0c;接通电源&#xff0c;按开机按钮。系统开机首次进入的是以nvidia用户登录的Ubuntu 命令行界面。习惯使用图形界面的用户莫慌&#xff0c;首次开机通过startx 命令发现无法启动图形界面&#xff0c;解决办法见(Jetson TX2开篇--安…

threejs加载3D模型例子

加载3D模型 首先要引入ColladaLoader加载器&#xff0c;Collada是一个3D模型交换方案&#xff0c;即不同的3D模型可以通过Collada进行相互转换&#xff0c;言外之意&#xff0c;threejs可以使用Collada将3D模型的数据转换成自己支持的格式&#xff0c;从而在浏览器上渲染出来。…

snailsvn使用教程_mac下使用snailSVN的踩坑之旅

一个很心酸的故事&#xff0c;公司了使用苹果电脑的只有我一个人&#xff0c;然后刚开始使用苹果电脑&#xff0c;开启了我饿自闭之旅&#xff0c;网上查到的一些方法是不可以使用的&#xff0c;所以我把正确的方法记录下来&#xff0c;给大家指个路首先&#xff0c;说明下&…

bzoj 1083 繁忙的都市

题目链接&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id1083 题解&#xff1a; 在bzoj里能遇到如此如此水的题真是不容易…… 乍一看好像有点吓人&#xff0c;其实是一道Kruskal模板题…… 1 #include<cstdio>2 #include<algorithm>3 using namesp…