在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
video标签 浏览器的video标签通常是接收一个src属性,然后浏览器就会根据这个src属性来自动加载视频。 这种方式有什么问题吗?
请求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标签播。 <div class="a"> <video id="video" controls preload="auto"></video> </div> <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标签。我们现在绕过了浏览器直接去请求src这一步,ajax请求视频流,然后我们可以对视频流进行处理,直接操作视频流实现我们需要的各种功能。 播放器 公司同事研发了一款开源播放器,https://github.com/bytedance/xgplayer ,西瓜视频好几千万dau的产品实测。 播放器原理 它是利用了流式处理视频源,不仅仅是简单的请求流然后交给video标签播放,它是请求视频流然后用js解码然后进行一些需要的操作,交给video播放。 为什么要用js解码呢? 公司大部分视频是mp4,怎么让mp4支持流播放呢?我们把mp4的流拿过来,js解析出它的视频信息,然后js转换成支持视频流的fmp4格式的文件。
我们直接操作的视频流,所以在对视频进行清晰度切换,或者快进的时候,我们后计算当前时间的流,然后用js加载视频的新的流,从而进行最快的加载和响应。 到此这篇关于html5用video标签流式加载的实现的文章就介绍到这了,更多相关html5用video标签流式加载内容请搜索极客世界以前的文章或继续浏览下面的相关文章,希望大家以后多多支持极客世界! |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论