当前位置:首页 > 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和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…