html5标签怎么做(html5用video标签流式加载的实现)
html5标签怎么做
html5用video标签流式加载的实现video标签
浏览器的video标签通常是接收一个src属性,然后浏览器就会根据这个src属性来自动加载视频。
这个过程是浏览器来加载video的。
这种方式有什么问题吗?
- mp4文件不能流式加载
- webm,flv,hls等格式兼容性问题
- 播放器ui太丑,一些常用的功能都没有
- 清晰度切换,等一些操作需要重载视频,比较慢而且还会黑屏
- 无法对视频加密
请求video流视频
我们可以通过设置responseType为arraybuffer来获取视频流,也可以通过range字段来获取视频流片段。比如
let xhr = new window.XMLHttpRequest(); xhr.responseType = 'arraybuffer' xhr.open('get', 'http://www.w3school.com.cn/i/movie.mp4') xhr.responseType = 'arraybuffer'; // xhr.setRequestHeader('Range', `bytes=0-390625`) xhr.onload = function () { if (xhr.status === 200 || xhr.status === 206) { console.log(xhr.response) } } xhr.send();
或者fetch的arrayBuffer方法返回视频流。
fetch(videoUrl).then(function(response) { return response.arrayBuffer(); })
获取到的数据是什么呢?二进制的视频流。
获取这个有什么用呢?
video去播“流”
MediaSource
MediaSource简称mse,是h5的一个api,它允许通过js生成媒体流,让浏览器播放。
使用
我们通过 URL.createObjectURL来创建一个blob格式的视频文件,来给video标签播。
具体用法就是new MediaSource,然后根据这个MediaSource生成blob文件,然后向MediaSource中添加mime和视频流。
<li class="a"> <video id="video" controls preload="auto"></video> </li> <script> $(function() { var video = document.querySelector('#video'); var mediaSource = new MediaSource(); video.src = URL.createObjectURL(mediaSource); mediaSource.addEventListener('sourceopen', sourceOpen); function sourceOpen(e) { URL.revokeObjectURL(video.src); // 设置 媒体的编码类型 var mime = 'video/webm; codecs="vorbis,vp8"'; var mediaSource = e.target; var sourceBuffer = mediaSource.addSourceBuffer(mime); var videoUrl = 'http://localhost:9090/examples/mp4/video.webm'; fetch(videoUrl).then(function(response) { console.log(response) return response.arrayBuffer(); }) .then(function(arrayBuffer) { sourceBuffer.addEventListener('updateend', function(e) { if (!sourceBuffer.updating && mediaSource.readyState === 'open') { mediaSource.endOfStream(); // 在数据请求完成后,我们需要调用 endOfStream()。它会改变 MediaSource.readyState 为 ended 并且触发 sourceended 事件。 video.play().then(function() {}).catch(function(err) { console.log(err) }); } }); sourceBuffer.appendBuffer(arrayBuffer); }); } }) </script>
我们的mine是什么呢?
video/webm是视频格式,codecs后面第一段是一些视频编解码的一些重要信息,诸如编码方式、分辨率、帧率、码率以及对解码器解码能力的要求。
第二段是关于音频部分的信息。
生成这样的一个video标签。我们现在绕过了浏览器直接去请求src这一步,ajax请求视频流,然后我们可以对视频流进行处理,直接操作视频流实现我们需要的各种功能。
但是对于mp4格式,是不支持流式加载的,所以只能通过我们自己操作流来实现流式播放。
播放器
公司同事研发了一款开源播放器,https://github.com/bytedance/xgplayer ,西瓜视频好几千万dau的产品实测。
播放器原理
它是利用了流式处理视频源,不仅仅是简单的请求流然后交给video标签播放,它是请求视频流然后用js解码然后进行一些需要的操作,交给video播放。
为什么要用js解码呢?
公司大部分视频是mp4,怎么让mp4支持流播放呢?我们把mp4的流拿过来,js解析出它的视频信息,然后js转换成支持视频流的fmp4格式的文件。
它的优势是
- 解决了chrome不支持hls格式的问题(还有各种不支持格式的问题),因为我们是直接操作二进制视频数据,所以不存在video标签不支持的情况。
- 解决了切换清晰度重新刷新视频的问题
- 对于mp4文件快进操作进行最小化的请求加载,让它支持流式加载。
- 支持直播和弹幕
我们直接操作的视频流,所以在对视频进行清晰度切换,或者快进的时候,我们后计算当前时间的流,然后用js加载视频的新的流,从而进行最快的加载和响应。
到此这篇关于html5用video标签流式加载的实现的文章就介绍到这了,更多相关html5用video标签流式加载内容请搜索开心学习网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持开心学习网!
- html5video怎么优化(HTML5 video循环播放多个视频的方法步骤)
- html5video怎么优化(html5 移动端视频video的android兼容去除播放控件、全屏)
- html5标签怎么做(html5用video标签流式加载的实现)
- videojs播放流媒体(video.js支持m3u8格式直播的实现示例)
- html5 video 事件(HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题)
- video tv cast怎么用(video下autoplay属性无效的解决方法添加muted属性)
- 自动化播放声音(video实现有声音自动播放的实现方法)
- html5 video标签
- html5怎么滚动屏幕(HTML5 video进入全屏和退出全屏的实现方法)
- html5播放代码(html5 video全屏播放/自动播放的实现示例)
- h5 video支持格式(H5 video poster属性设置视频封面的方法)
- html5video怎么用(html5视频媒体标签video的使用方法及完整参数说明详解)
- html5支持video的视频格式(解决html5中的video标签ios系统中无法播放使用的问题)
- h5前端入门(前端H5 Video常见使用场景简介)
- 菲律宾特产(菲律宾特产最值得买回国)
- 越南特产(越南特产首饰)
- TVB负评王连续挑战警察角色《使徒行者3》中将饰演卧底(TVB负评王连续挑战警察角色使徒行者3中将饰演卧底)
- 《精英律师》剧照首曝光,实力演员飙戏,演绎律政职场百态(精英律师剧照首曝光)
- 靳东领衔打造高精职场 新丽出品《精英律师》曝定妆照(靳东领衔打造高精职场)
- 靳东新剧《精英律师》定档,众星云集,这剧可追(靳东新剧精英律师定档)
热门推荐
- iis搭建网站的地址(IIS站点所有文件直接下载 强制下载)
- vue插槽的分类(vue具名插槽的基本使用实例)
- axios调用接口(如何实现axios的自定义适配器adapter)
- iframe嵌入页面高度自动适应
- html5新的表单元素新的特性(HTML5表单验证特性知识点小结)
- filter的用法css(CSS filter 有什么神奇用途)
- apache服务部署tomcat(详解Apache 和 Tomcat 整合原理、配置方案)
- canvas两种形式动画(用canvas做一个DVD待机动画的实现代码)
- socket和tcp什么关系(TCP socket SYN队列和Accept队列区别原理解析)
- python中if语句应学会什么(Python基础之条件控制操作示例if语句)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9