Media Source 系列 - 结合 range 控制媒体请求缓存大小

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,182元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
简介:

上一篇写了 [Media Source 系列 - 播放 m3u8 文件] , 写了使用 MSE 来播放一个包含分片内容的资源。同样除此之外,我们可以借助 MSE 来进行更加 细粒 的缓存控制调度。

HTTP Range

HTTP Range ,HTTP 协议范围请求允许服务器只发送 HTTP 消息的一部分到客户端。范围请求在传送大的媒体文件,或者与文件下载的断点续传功能搭配使用时非常有用。假如在响应中存在 Accept-Ranges 首部(并且它的值不为 “none”),那么表示该服务器支持范围请求。

比如我们请求一个视频的一部分:

$ curl http://localhost:8000/media-source/vdeoplayback.mp4 -i -H "Range: bytes=0-1023"

vued5a9c99d17510edf16d4df4559e15e75d.png

使用 fetch 请求 视频的一部分内容

正如前面提到了,如果服务器支持请求 range 的内容,我们可以使用 Fetch 来设置 header 中 range 的值。

 fetch('your_file.mp4', { headers: { range: 'bytes=0-567139' } })
    .then(response => response.arrayBuffer())
    .then(data => {
      // source buffer
    });

这样我们就可以尽量控制我们才开始请求的媒体资源的缓存量大小了。

使用 MSE 播放

当然这样还不能完全播放,因为我们需要通过 MSE 来播放我们缓存的内容。

var mime = 'video/webm; codecs="vorbis, vp8"';
        var mediaSource = e.target;
        sourceBuffer = mediaSource.addSourceBuffer(mime);
        sourceBuffer.addEventListener('updateend', updateEnd);
        log('.js-log-m3u8', 'Fetch Segment ~' + videoUrl);
        var ranges = 'bytes=' + (500000 * index) + '-' + (500000 * (index+1))
        fetch(videoUrl, {
            headers: { range: ranges } 
        }).then(function (response) {
            return response.arrayBuffer();
        })
        .then(function (data) {
            sourceBuffer.appendBuffer(data);
        });

随后我们在播放的过程中再控制下面的分片的添加:

function fetchNextSegment() {
        index += 1;
        var ranges = 'bytes=' + (500000 * index + 1) + '-' + (500000 * (index+1))
        fetch(videoUrl, {
            headers: { range: ranges }
        })
        .then(response => response.arrayBuffer())
        .then(data => {
            var sourceBuffer = mediaSource.sourceBuffers[index-1];
            sourceBuffer.appendBuffer(data);
        });
    }

这样我们就有足够的能力进行缓存的控制了。

Github

目录
相关文章
|
存储 缓存 安全
第二章 HTTP请求方法、状态码详解与缓存机制解析
第二章 HTTP请求方法、状态码详解与缓存机制解析
286 0
|
6月前
|
数据采集 缓存 JavaScript
数据抓取的缓存策略:减少重复请求与资源消耗
本教程聚焦于提升爬虫效率与稳定性,通过结合缓存策略、代理IP技术(如爬虫代理)、Cookie和User-Agent设置,优化数据采集流程。以知乎为例,详细讲解如何抓取指定关键词的文章标题和内容。内容涵盖环境准备、代码实现、常见问题及解决方案,并提供延伸练习,帮助读者掌握高效爬虫技巧。适合具备Python基础的初学者,助你规避网站机制,顺利获取目标数据。
160 2
数据抓取的缓存策略:减少重复请求与资源消耗
|
12月前
|
缓存 JavaScript 中间件
优化Express.js应用程序性能:缓存策略、请求压缩和路由匹配
在开发Express.js应用时,采用合理的缓存策略、请求压缩及优化路由匹配可大幅提升性能。本文介绍如何利用`express.static`实现缓存、`compression`中间件压缩响应数据,并通过精确匹配、模块化路由及参数化路由提高路由处理效率,从而打造高效应用。
427 86
|
存储 缓存 运维
平稳扩展:可支持RevenueCat每日12亿次API请求的缓存
平稳扩展:可支持RevenueCat每日12亿次API请求的缓存
200 58
|
11月前
|
缓存 JavaScript CDN
一次js请求一般情况下有哪些地方会有缓存处理?
一次js请求一般情况下有哪些地方会有缓存处理?
105 4
|
缓存 JavaScript CDN
一次js请求一般情况下有哪些地方会有缓存处理?
一次js请求一般情况下有哪些地方会有缓存处理?
195 0
|
域名解析 存储 缓存
HTTP请求流程概览:浏览器构建请求行含方法、URL和版本;检查缓存;解析IP与端口
【6月更文挑战第23天】 HTTP请求流程概览:浏览器构建请求行含方法、URL和版本;检查缓存;解析IP与端口;TCP连接(HTTP/1.1可能需排队);三次握手;发送请求头与体;服务器处理并返回响应;TCP连接可能关闭或保持;浏览器接收并显示响应,更新缓存。HTTP版本间有差异。
274 5
|
缓存 负载均衡 NoSQL
Redis系列学习文章分享---第十四篇(Redis多级缓存--封装Http请求+向tomcat发送http请求+根据商品id对tomcat集群负载均衡)
Redis系列学习文章分享---第十四篇(Redis多级缓存--封装Http请求+向tomcat发送http请求+根据商品id对tomcat集群负载均衡)
163 1
|
缓存 JavaScript CDN
一次js请求一般情况下有哪些地方会有缓存处理?
一次js请求一般情况下有哪些地方会有缓存处理?
71 0
|
缓存 JavaScript 前端开发
一次js请求一般情况下有哪些地方会有缓存处理?
一次js请求一般情况下有哪些地方会有缓存处理?
94 1