H5 video 开发问题及相关知识点

相关链接:

  • H5 video 的使用
  • H5 video 全屏播放

♢ video点播与直播

 H5 video目前所有浏览器都支持的视频格式是MP4格式,所以mp4应当是点播web视频的首选格式。

而在直播视频上,H5 video只在移动端原生支持HLS流的直播视频(Mac safari video标签也支持, PC Chrome不支持),其他直播流(如FLV)就需要Flash插件的支持。


♢ video与206状态码

video播放mp4时,发的依然是get请求,但http返回206状态码, 即partial Content。有关206状态码的相关内容,可以参考下文
  • Http协议206状态码


♢ 终止视频下载

video.pause() 可以暂停视频播放,但并不能停止视频资源的继续加载,媒体元素会继续加载知道被垃圾回收机制回收。
要在暂停播放后立即停止,可使用以下方法

video.pause()
video.src=''
video.removeAttribute('src');复制代码

♢ 防止iOS上默认全屏播放

ios10及以后的版本,可以通过给video标签加playsinline属性防止iOS默认全屏播放,ios9之前加webkit-playsinline属性,如果要兼容,则把两个属性都加上。

通过客户端添加配置UIwebview: webview.allowsInlineMediaPlayback = YES,不过还是要求在video元素上加playsinline属性

参考:
  • HTML5 inline video on iPhone vs iPad/Browser
  • allowsInlineMediaPlayback

♢ 自动播放及播放控制

在移动端,有些浏览器支持添加autoplay属性后自动播放,有些设置 autoplay 和 muted属性也能自动播放,比如IOS 10+、Chrome。

如果想控制什么时候播放,且并不是用户触发的(如没有设置controls),那就设置muted属性,然后调用video.play()方法,隔300ms左右有后,再通过video.muted = false打开声音。

vide.muted = true;
video.play()
setTimeout(function () {video.muted = false
}, 300)复制代码

iOS9及之前的版本要求有用户交互才能播放,即手动点击播放按钮或者有用户触发的click、touchend、键盘等事件,然后调用video.play() 方法播放。在iOS9之前,iOS Native可以通过UIWebView的mediaPlaybackRequiresUserAction属性来控制是否需要用户交互。

使用element.click()触发的click事件是否可以被人为是用户行为?不能
浏览器是如何知道是否是用户触发的事件?Event对象的只读属性isTrusted

<div id="test-ele">这个元素监听事件</div>
<script>const testEle = document.querySelector('#test-ele');testEle.addEventlistener('click', function (evt) {// 用户触发为true,script或EventTarget.dispatchEvent() 触发为falseconsole.log(evt.isTrusted);}, false);testEle.click() // 这个触发,evt.isTrusted = false
</script>复制代码

有关iOS 10对safari video的放松策略可以参考: New <video> Policies for iOS

♢ video.play() 的Promise对象(可用于捕获视频播放错误)

在Chrome上,如果没有设置video.muted属性,在非用户行为下,直接使用video.play() 播放,会收到 Uncaught (in promise) DOMException 的报错,视频也没有播放。在iOS下面,可能不会有任何报错,视频也没播放,这样就无法定位问题。

video.play() 会返回一个Promise对象,如果播放失败,可以通过返回的Promise catch到相关错误信息。

const pro = video.play();
if (pro) {  // iOS9及以下版本不会返回Promise对象,做下兼容处理pro.catch(err=>{ console.log(err) });   
}复制代码


♢ TimeRanges 对象

在开始获取played属性的时候,以为会返回一个已经播放的时长,实际上返回的是TimeRanges对象,而且看到TimeRanges的length一直不变,当时一脸摸不着头脑,不知道有什么用。后来在做进度控制,需要知道视频已缓冲多少时,才弄明白。

video DOM对象有三个属性会返回TimeRanges对象,分别为video.played/ video.buffered/ video.seekable

视频开始时只有一个播放时间段,如果不进行跳跃观看,就一直只有一个时间段,即 TimeRanges.length 值为1;如果进行了跳跃观看(如从2分钟,突然跳进到15分钟的位置),而跳跃内容并没有缓冲完毕,则会出现两个时间段,这时TimeRanges的length为2。所以TimeRanges个数会随着跳跃观看未缓冲完成的内容而增加,随着缓冲的完成而减少,最少为1个,即从开头到结尾。

------------------------------------------------------
|=============| |===========| |
------------------------------------------------------
0         5                15 19    21

TimeRanges对象有一个length属性和start()play()两个方法:
TimeRanges: length: 1 // 代表当前播放视频存在的播放段 play(index) // 获取指定播放段的播放(缓冲)开始时间,index从0开始取,以秒计 end(index) // 获取指定播放段的播放(缓冲)结束时间

要获取第一段的开始时间,使用TimeRanges.start(0),结束时间为TimeRanges.end(0),第二段TimeRanges.start(1),以此类推

参考:
  • Media buffering, seeking, and time ranges: developer.mozilla.org/en-US/docs/…
  • Time​Ranges: developer.mozilla.org/en-US/docs/…

♢ video的宽高

video视区的高宽根据视频源有不同的固定比例,但并不会出现因video标签或其容器的高宽设置比例与视频源比例不一致而出现拉伸、变形,会自动根据设置的高宽中较小的值按照自身的比例进行缩放,不足的会两边补白居中。

如视频的原始尺寸为640 * 360


设置video高400、宽800,高度的增长跟宽度的增长不成比例,宽度会比视宽度宽,则video会左右补白,视区居中。



转载于:https://juejin.im/post/5ce037c46fb9a07f0b039234

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

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

相关文章

Mybatis-Generator自动生成XML文件以及接口和实体类

整合了MySQL和Oracle配置文件生成方法 这个是整个文件夹的下载地址&#xff1a;http://www.codepeople.cn/download 主要给大家介绍一下generatorConfig.xml文件的配置&#xff0c;以及生成后的文件。 generatorConfig.xml <?xml version"1.0" encoding"UTF…

如何在Windows 10上设置默认Linux发行版

Windows 10 now allows you to install multiple Linux environments, starting with the Fall Creators Update. If you have multiple Linux environments, you can set your default and switch between them. Windows 10现在允许您从Fall Creators Update开始安装多个Linux…

mysql全备份+增量备份笔记总结

备份基础知识 冷备&#xff08;cold backup&#xff09;&#xff1a;需要关mysql服务&#xff0c;读写请求均不允许状态下进行&#xff1b; 温备&#xff08;warm backup&#xff09;&#xff1a; 服务在线&#xff0c;但仅支持读请求&#xff0c;不允许写请求&#xff1b; 热备…

pjax学习

PJAX 介绍 红薯 发布于 2012/04/11 22:06阅读 61K收藏 116评论 11jQuery.Pjax kissy开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f;->>> 介绍 pushState是一个可以操作history的api&#xff0c;该api的介绍和使用请见这里&#xff1a…

SQL Server 2000详细安装过程及配置

说明&#xff1a;这篇文章是几年前我发布在网易博客当中的原创文章&#xff0c;但由于网易博客现在要停止运营了&#xff0c;所以我就把这篇文章搬了过来&#xff0c;虽然现如今SQL Server 2000软件早已经过时了&#xff0c;但仍然有一部分人在使用它&#xff0c;尤其是某些高校…

移动应用ios和网页应用_如何在iOS上一次移动多个应用

移动应用ios和网页应用Apple doesn’t really believe in detailed instruction manuals, so some handy tricks slip through the cracks. One such trick we’ve recently discovered is that you can move multiple app icons at once on iOS. Here’s how. Apple并不真正相…

如何将内核静态库编译连接到驱动程序中去【转】

转自&#xff1a;http://blog.csdn.net/ganjianfeng2003/article/details/8089551 如何将内核静态库编译连接到驱动程序中去 2010-12-07 08:27 331人阅读 评论(1) 收藏 举报 http://blog.chinaunix.net/u2/61663/showart_2404744.html 刚上邮箱的时候发现一位网友向我询问这个问…

2018-2019 20165226 Exp9 Web安全基础

2018-2019 20165226 Exp9 Web安全基础 目录 一、实验内容说明及基础问题回答 二、实验过程 Webgoat准备XSS攻击 ① Phishing with XSS 跨站脚本钓鱼攻击② Stored XSS Attacks 存储型XSS攻击③ Reflected XSS Attacks 反射型XSS攻击 CSRF攻击 ① Cross Site Request Forgery(CS…

用 git 同步 Colab 与 Gitlab、Github 之间的文件

Colab 是谷歌提供的免费 Jupyter 服务&#xff0c;可使用 GPU。但由于每次的 VM &#xff08;虚拟机&#xff09;登出后所有文件都会连同&#xff36;&#xff2d;被毁掉。如何将一个项目里的程序或数据同步到 Colab则往往比较麻烦。尽管谷歌盘也可以挂到 Colab 里用&#xff0…

keep-alive使用_如何使用Google Keep进行无忧笔记

keep-alive使用There are a lot of note-taking apps out there. Google Keep may not be as powerful as services like Evernote, but its value is in its simplicity. Let’s talk about how to make the most of it. 那里有很多笔记应用程序。 Google Keep可能不如Evernot…

ZedGraph在项目中的应用

ZedGraph在项目中的应用将数据库数据提取出来&#xff0c;显示成曲线图&#xff08;饼状、柱状或立体图&#xff09;是项目中最常见的需求。 网上搜索到的解决方法&#xff0c;大多归为两类&#xff0c;一种是利用ActiveX组件&#xff0c;另一种是使用.net框架自带的画图的类。…

TCP/IP:IP多播选路

本节主要讨论多播选路&#xff0c;是在整个互联网上的多播&#xff0c;我们将讨论mrouted程序的执行&#xff0c;该程序计算多播路由表&#xff0c;以及再网络之间转发多播数据包的内核函数。 多播输出处理 这个和IGMP的输出处理类似&#xff0c;主要要注意有环回的多播输出和没…

Leetcode#832. Flipping an Image(翻转图像)

题目描述 给定一个二进制矩阵 A&#xff0c;我们想先水平翻转图像&#xff0c;然后反转图像并返回结果。 水平翻转图片就是将图片的每一行都进行翻转&#xff0c;即逆序。例如&#xff0c;水平翻转 [1, 1, 0] 的结果是 [0, 1, 1]。 反转图片的意思是图片中的 0 全部被 1 替换&a…

数据安全 数据销毁_如何安全销毁敏感数据CD / DVD?

数据安全 数据销毁You have a pile of DVDs with sensitive information on them and you need to safely and effectively dispose of them so no data recovery is possible. What’s the most safe and efficient way to get the job done? 您有一堆DVD&#xff0c;上面有敏…

cannot find -lunwind-x86_64

错误代码&#xff1a;; }) libtool: install: /usr/bin/install -c .libs/libunwind.lai /usr/local/lib/libunwind.la libtool: install: warning: relinking libunwind-setjmp.la libtool: install: (cd /down/libunwind-1.0/src; /bin/sh /down/libunwind-1.0/libtool --…

动态切换父元素隐藏和显示里面的子元素的动画会再一次执行吗?

代码&#xff1a;完整代码:<!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title></title> <style type"text/css"> *{ margin: 0; padding: 0; } .box{ background-color: #00B83F; } .flag{ position…

MAD huashi

name1 input("请输入一个名字") name2 input("请输入一个名词") name3 input("请输入一个形容词") name4 input("请输入一个名字") name5 input("请输入一个名字") name6 input("请输入一个长辈名字") name…

如何使用QuickConnect远程访问Synology NAS

Your Synology NAS includes a QuickConnect feature that lets you access its DiskStation Manager interface remotely. Here’s how to set it up. Synology NAS包含快速连接功能&#xff0c;可让您远程访问其DiskStation Manager界面。 设置方法如下。 You were likely gr…

深入MySQL存储引擎分析锁和排序的原理

几个问题 为什么不建议使用订单号作为主键?为什么要在需要排序的字段上加索引?for update 的记录不存在会导致锁住全表?redolog 和 binlog 有什么区别?MySQL 如何回滚一条 sql ?char(50) 和 varchar(50) 效果是一样的么?索引知识回顾 对于 MySQL 数据库而言,数据是存储在…

网络编程介绍

1. 目标:编写一个C/S架构的软件 C/S: Client--------基于网络----------Server B/S: Browser-------基于网络----------Server2. 服务端需要遵循的原则: 1. 服务端与客户端都需要有唯一的地址,但是服务端的地址必须固定/绑定 2. 对外一直提供服务,稳定运行 3. 服…