使用 XMLHttpRequest 本地缓存音乐和视频 解决播放地址超时过期问题

理论上来说,这种方式的缓存可以缓存任意的文件,最近做的一个音乐播放器需要这样的功能,具体来说就是 MP3 的播放地址是有有效期的,大概 10 分钟左右,理论上来说浏览器应该会一直下载文件然后缓存起来,在实际的测试中发现,Google 浏览器并不是这样,因为播放地址是“加密”的,带有一个参数 key,所以这个文件不设置缓存,google 都是实时去请求数据。

使用 XMLHttpRequest 本地缓存音乐和视频 解决播放地址超时过期问题

实现方法

想到的一种方案就是将 MP3 文件直接下载到本地,然后转换成 blob 地址传给 audio 标签播放视频,这样虽然有一个加载的过程,但是也能解决播放地址超时问题。

let that = this;

let xhr = new XMLHttpRequest();

xhr.open('GET', this.mp3Src2, true);

xhr.responseType = 'blob';

xhr.addEventListener(

'load',

function () {

if (xhr.status === 200) {

that.isLoading = false;

let blob = this.response;

let url = window.URL.createObjectURL(blob);

that.mp3Src = url;

}

},

false

);

// 发送异步请求

xhr.onprogress = function (evt) {

that.progress = Math.ceil((evt.loaded / evt.total) * 100);

};

xhr.send();

设置 responseType 为 blob,XMLHttpRequest 异步请求回来的数据就是 blob 对象,通过 window.URL.createObjectURL() 转换为 blob 的地址。

弊端

这样处理以后会有以下几个问题:

  • 如果文件比较大,那么这个加载的过程会很长,因为必须当文件都加载完成以后才能转换出本地播放的地址
  • 因为是 ajax 异步请求,所以服务器要设置跨域
  • 因为浏览安全设置的问题,https 和 http 不能混用,简单来说,主站点如果是 https,资源站是 http 就不行

将文件存到 localStorage 中

var fileReader = new FileReader();

fileReader.onload = function (evt) {

// 用 Data URI 的格式读取文件内容

var result = evt.target.result;

// 将图片的 src 指向 Data URI

music.setAttribute("src", result);

//保存到本地存储中

try {

localStorage.setItem("music", result);

} catch (e) {

console.log("Storage failed: " + e);

}

};

// 以Data URI的形式加载blob

fileReader.readAsDataURL(blob);

以上是 使用 XMLHttpRequest 本地缓存音乐和视频 解决播放地址超时过期问题 的全部内容, 来源链接: utcz.com/p/232702.html

回到顶部