当前位置:首页 > JavaScript

js实现视频下载

2026-01-30 23:56:47JavaScript

使用 Blob 对象和 URL.createObjectURL 下载视频

通过将视频数据转换为 Blob 对象并创建临时 URL 实现下载。需要确保服务器允许跨域请求或视频源与网页同域。

function downloadVideo(url, filename) {
  fetch(url)
    .then(response => response.blob())
    .then(blob => {
      const blobUrl = URL.createObjectURL(blob);
      const a = document.createElement('a');
      a.href = blobUrl;
      a.download = filename || 'video.mp4';
      document.body.appendChild(a);
      a.click();
      document.body.removeChild(a);
      URL.revokeObjectURL(blobUrl);
    });
}

通过 MediaRecorder API 录制流媒体

适用于需要录制正在播放的视频流的情况,如 WebRTC 流或摄像头视频。

function recordStream(videoElement, duration, filename) {
  const stream = videoElement.captureStream();
  const recorder = new MediaRecorder(stream);
  const chunks = [];

  recorder.ondataavailable = e => chunks.push(e.data);
  recorder.onstop = () => {
    const blob = new Blob(chunks, { type: 'video/webm' });
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = filename || 'recording.webm';
    a.click();
  };

  recorder.start();
  setTimeout(() => recorder.stop(), duration);
}

使用 Service Worker 缓存视频

对于需要离线下载的场景,可以通过 Service Worker 缓存视频资源。

// 在 Service Worker 中
self.addEventListener('fetch', event => {
  if (event.request.url.includes('.mp4')) {
    event.respondWith(
      caches.match(event.request)
        .then(response => response || fetch(event.request))
    );
  }
});

// 在主线程中
async function cacheVideo(url) {
  const cache = await caches.open('video-cache');
  await cache.add(url);
}

处理跨域问题的解决方案

当视频资源存在跨域限制时,可以考虑以下方法:

  1. 配置服务器 CORS 头

    Access-Control-Allow-Origin: *
    Access-Control-Expose-Headers: Content-Length
  2. 使用代理服务器中转请求

    js实现视频下载

    const proxyUrl = 'https://cors-anywhere.herokuapp.com/';
    fetch(proxyUrl + originalUrl)
    .then(response => response.blob())
    // 后续处理与常规下载相同

注意事项

  • 浏览器安全策略可能阻止某些下载行为
  • 大文件下载需要考虑内存占用和进度显示
  • 部分视频网站有DRM保护,无法直接下载
  • 移动端浏览器可能存在更多限制

标签: 视频下载js
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时功能可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是几种常见的实现方式: 使用 setInterva…

js实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…