zoukankan      html  css  js  c++  java
  • 用video标签流式加载

    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://www.cnblogs.com/dh-dh/p/9254172.html

  • 相关阅读:
    【WIN10】我的第一個WIN10-UWP應用——古文觀止
    【WIN10】文本圖標
    【WIN10】VisualStateManager使用說明
    【WIN10】Storyboard動畫板
    【WIN10】Bind、Binding與Converter的使用
    struts执行过程
    在jsp中的局部和全局变量
    jsp页面中的:<%@ page contentType="text/html; charset=utf-8" language="java"%>的作用及含义
    jsp中的this
    在Java接口中怎样访问定义的常量呢?
  • 原文地址:https://www.cnblogs.com/saysmy/p/10701396.html
Copyright © 2011-2022 走看看