前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用video标签流式加载

用video标签流式加载

作者头像
smy
发布2019-04-21 15:35:27
3.7K0
发布2019-04-21 15:35:27
举报
文章被收录于专栏:smysmy

video标签

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

这种方式有什么问题吗?

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

请求video流视频

我们可以通过设置responseType为arraybuffer来获取视频流,也可以通过range字段来获取视频流片段。比如

代码语言:javascript
复制
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方法返回视频流。

代码语言:javascript
复制
 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和视频流。

代码语言:javascript
复制
<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://www.cnblogs.com/dh-dh/p/9254172.html

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-04-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • video标签
    • 这种方式有什么问题吗?
    • 请求video流视频
    • video去播“流”
    • MediaSource
      • 使用
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档