当前位置:首页 > JavaScript

js实现视频下载

2026-04-04 15:48:25JavaScript

使用Blob对象下载视频

通过XMLHttpRequest或fetch获取视频数据流,转换为Blob对象后创建下载链接。

js实现视频下载

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

使用MediaSource扩展

处理分段视频流时,可通过MediaSource API实现渐进式下载。

js实现视频下载

const video = document.getElementById('video');
const mediaSource = new MediaSource();

video.src = URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', () => {
  const sourceBuffer = mediaSource.addSourceBuffer('video/mp4; codecs="avc1.42E01E"');
  fetchVideoSegments().then(segments => {
    segments.forEach(segment => {
      sourceBuffer.appendBuffer(segment);
    });
  });
});

处理跨域问题

当视频资源存在CORS限制时,需配置代理服务器或使用服务端中转。

// 服务端代理示例(Node.js)
const express = require('express');
const fetch = require('node-fetch');
const app = express();

app.get('/proxy', async (req, res) => {
  const videoRes = await fetch(req.query.url);
  videoRes.body.pipe(res);
});

分片下载大文件

对于大型视频文件可采用分块下载策略。

async function downloadInChunks(url, chunkSize = 1024 * 1024) {
  const fileSize = await getFileSize(url);
  const chunks = Math.ceil(fileSize / chunkSize);

  for (let i = 0; i < chunks; i++) {
    const start = i * chunkSize;
    const end = Math.min(start + chunkSize, fileSize);
    const chunk = await fetch(url, {
      headers: { Range: `bytes=${start}-${end}` }
    }).then(res => res.blob());
    // 处理分片数据
  }
}

注意事项

  1. 确保目标视频允许下载,避免侵犯版权
  2. 大文件下载建议显示进度条
  3. 移动端浏览器可能存在Blob限制
  4. 考虑使用第三方库如FileSaver.js简化操作
// 进度监控示例
fetch(url)
  .then(response => {
    const reader = response.body.getReader();
    const contentLength = +response.headers.get('Content-Length');
    let receivedLength = 0;

    return new ReadableStream({
      start(controller) {
        function push() {
          reader.read().then(({ done, value }) => {
            if (done) {
              controller.close();
              return;
            }
            receivedLength += value.length;
            updateProgress(receivedLength / contentLength);
            controller.enqueue(value);
            push();
          });
        }
        push();
      }
    });
  });

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

相关文章

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…