video标签

浏览器的video标签通常是接收一个src属性,然后浏览器就会根据这个src属性来自动加载视频。
这个过程是浏览器来加载video的。

这种方式有什么问题吗?

  1. mp4文件不能流式加载
  2. webm,flv,hls等格式兼容性问题
  3. 播放器ui太丑,一些常用的功能都没有
  4. 清晰度切换,等一些操作需要重载视频,比较慢而且还会黑屏
  5. 无法对视频加密

请求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和视频流。

<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/webm是视频格式,codecs后面第一段是一些视频编解码的一些重要信息,诸如编码方式、分辨率、帧率、码率以及对解码器解码能力的要求。
第二段是关于音频部分的信息。


生成这样的一个video标签。我们现在绕过了浏览器直接去请求src这一步,ajax请求视频流,然后我们可以对视频流进行处理,直接操作视频流实现我们需要的各种功能。
但是对于mp4格式,是不支持流式加载的,所以只能通过我们自己操作流来实现流式播放。

播放器

公司同事研发了一款开源播放器,https://github.com/bytedance/xgplayer ,西瓜视频好几千万dau的产品实测。

播放器原理

它是利用了流式处理视频源,不仅仅是简单的请求流然后交给video标签播放,它是请求视频流然后用js解码然后进行一些需要的操作,交给video播放。

为什么要用js解码呢?

公司大部分视频是mp4,怎么让mp4支持流播放呢?我们把mp4的流拿过来,js解析出它的视频信息,然后js转换成支持视频流的fmp4格式的文件。
它的优势是

  1. 解决了chrome不支持hls格式的问题(还有各种不支持格式的问题),因为我们是直接操作二进制视频数据,所以不存在video标签不支持的情况。
  2. 解决了切换清晰度重新刷新视频的问题
  3. 对于mp4文件快进操作进行最小化的请求加载,让它支持流式加载。
  4. 支持直播和弹幕

我们直接操作的视频流,所以在对视频进行清晰度切换,或者快进的时候,我们后计算当前时间的流,然后用js加载视频的新的流,从而进行最快的加载和响应。

转载于:https://www.cnblogs.com/dh-dh/p/9254172.html

用video标签流式加载相关推荐

  1. [html] 说说video标签中预加载视频用到的属性是什么?

    [html] 说说video标签中预加载视频用到的属性是什么? 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

  2. 用ffmpeg修改MP4文件头信息,使其支持流式加载及播放

    经常有用户反映,有些网页中加载的mp4文件,有的可以加载一点就开始播放,有的就必须全部加载完才能播. 经核实,主要是头信息的数据顺序有关,用工具:mp4info.exe可以查看mp4文件的结构信息: ...

  3. 修正MP4文件头信息实现流式加载及播放

    阿酷TONY  / 原创 / 2022-11-10  /  长沙 / 2022-11 / 在web网页中加载的mp4播放时,有的mp4可以边加载边播放,而有的则不可以,是什么原因呢?根源是mp4文件本 ...

  4. 利用ajax实现织梦dedecms瀑布流无限加载功能

    该功能主要用到AJAX技术! 一.首先找到并打开/plus/list.php文件,在里面找到如下代码: require_once(dirname(__FILE__)."/../include ...

  5. 【Android 逆向】类加载器 ClassLoader ( 类加载时机 | 隐式加载 | 显示加载 | 类加载步骤 | 装载 | 链接 | 初始化 )

    文章目录 一.类加载时机 1.隐式加载 2.显式加载 二.类加载步骤 一.类加载时机 1.隐式加载 类加载 的 隐式加载 , 没有明确的说明加载某个类 , 但是进行了如下操作 : 使用 new 关键字 ...

  6. Spire.PDF迎来最新版本更新,Spire.PDF 8.7.2 支持从流中加载 OFD 文件

    Spire.PDF 8.7.2 支持从流中加载 OFD 文件 Spire.PDF for .net 更新至v8.7.2 .该版本支持从流中加载OFD文件,并在WPF程序集中增加了一个支持打印设置的接口 ...

  7. Ajax实现瀑布流动态加载网页

    瀑布流的动态加载效果是我一直以来觉得最喜欢的效果之一了.最近在工作中遇到了一个情景,当我登录到系统中时,需要向另一个系统发送多次接口查询数据,之后再将这些数据显示到页面上.这就存在了这样一个问题:页面 ...

  8. android搜索热词(热门标签)流式布局的实现

    先看下效果图 1.流式布局实现 继承ViewGroup,重写onMeasure,onLayout方法.代码如下: package com.example.lin.flowlayoutdemo;impo ...

  9. 小程序瀑布流无限加载

    由于想做成瀑布流,故一开始使用如下的方式: .waterfall-container {column-count: 2;column-gap: 30rpx; } 但是,由于这种  column-cou ...

最新文章

  1. MIT发布首个贝叶斯「数据清洗」机器人!8小时洗200万条数据
  2. 设计模式详解(总纲)
  3. CF232C Doe Graphs
  4. PostGIS_导入shp格式的数据
  5. scikit-learn机器学习常用算法原理及编程实战(五)
  6. 2013计算机二级试题,2013年3月全国计算机二级VFP真题
  7. MongoDB数据库的优点
  8. arduino学习笔记(三)——LED相关
  9. 如何看linux网络慢,Linux下网速慢的问题
  10. Oracle Database 10g for Windows安装
  11. win10计算机亮度在哪里调,win10电脑怎么调亮度
  12. 教我如何使用python编写一个界面
  13. 超级简单的自动刷新_144Hz刷新率真比60Hz快 谁用谁知道
  14. webug4.0总结篇
  15. 微信小游戏实战--cocos creator实现wordle游戏(六)
  16. WinDebug 常用命令表【摘】
  17. FitNesse接口用例设计
  18. Kotlin开发第四天,探究Fragment
  19. Jquery实现花瓣随机飘落(收藏自慕课网)
  20. 英语学习资源下载大全 一网打尽

热门文章

  1. Educational Codeforces Round 9 B. Alice, Bob, Two Teams 前缀和
  2. Putty server refused our key的解决方法
  3. C#中upd分包与发送,已经实现全部代码
  4. 给VS2008中c#代码自动添加版权信息
  5. 网络校时(非NTP)
  6. volley浅析(磨砺营马剑威Android)
  7. 程序生成30道四则运算(包括整数和真分数)
  8. 使用js给数组去重的3种常用方法
  9. ztree同级只显示一个节点
  10. ORACLE 常用函数——转换函数