当前位置:首页 > JavaScript

js实现视频切片

2026-01-30 22:46:59JavaScript

使用 MediaSource API 实现视频切片

通过 MediaSource API 可以将视频切分为多个片段并动态加载。核心流程包括创建 MediaSource 对象、监听 sourceopen 事件、添加 SourceBuffer 并分段追加视频数据。

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, mp4a.40.2"');

  // 获取并追加第一段视频
  fetchVideoSegment(0).then(data => {
    sourceBuffer.appendBuffer(data);
  });

  // 监听更新结束事件追加后续片段
  sourceBuffer.addEventListener('updateend', () => {
    if (!sourceBuffer.updating && mediaSource.readyState === 'open') {
      fetchVideoSegment(1).then(data => {
        sourceBuffer.appendBuffer(data);
      });
    }
  });
});

async function fetchVideoSegment(index) {
  const response = await fetch(`/video/segment${index}.mp4`);
  return response.arrayBuffer();
}

使用 Range 请求实现分片加载

通过 HTTP Range 头部可以请求视频的特定字节范围,结合 HTML5 Video 标签实现分片播放。

js实现视频切片

const video = document.getElementById('video');
const segmentSize = 1024 * 1024; // 1MB 分片

video.addEventListener('timeupdate', async () => {
  const currentTime = video.currentTime;
  const segmentIndex = Math.floor(currentTime / 5); // 每5秒一个分片

  if (!video.buffered.length || currentTime > video.buffered.end(0) * 0.7) {
    const startByte = segmentIndex * segmentSize;
    const endByte = startByte + segmentSize - 1;

    const response = await fetch('/video.mp4', {
      headers: { 'Range': `bytes=${startByte}-${endByte}` }
    });

    const blob = await response.blob();
    video.src = URL.createObjectURL(blob);
  }
});

使用 FFmpeg.js 进行前端切片

通过 FFmpeg.js 可以在浏览器中实现视频切片处理,需要先加载 FFmpeg 实例。

const { createFFmpeg } = FFmpeg;
const ffmpeg = createFFmpeg({ log: true });

async function sliceVideo(inputFile, startTime, duration) {
  await ffmpeg.load();
  ffmpeg.FS('writeFile', 'input.mp4', await fetchFile(inputFile));

  await ffmpeg.run(
    '-i', 'input.mp4',
    '-ss', startTime,
    '-t', duration,
    '-c', 'copy',
    'output.mp4'
  );

  const data = ffmpeg.FS('readFile', 'output.mp4');
  return new Blob([data.buffer], { type: 'video/mp4' });
}

// 调用示例
sliceVideo('input.mp4', '00:00:10', '5').then(blob => {
  const url = URL.createObjectURL(blob);
  document.getElementById('video').src = url;
});

注意事项

视频格式需要与浏览器兼容,推荐使用 MP4(H.264 + AAC) 或 WebM(VP8/VP9 + Opus/Vorbis) 格式。

js实现视频切片

分片大小需要根据网络状况调整,过小的分片会增加请求开销,过大的分片会影响加载速度。

跨域请求需要服务器配置正确的 CORS 头,包括 Access-Control-Allow-OriginAccess-Control-Expose-Headers

MediaSource API 对视频的编码格式有严格要求,需要确保分片视频的 moov atom 位于文件开头。

标签: 切片视频
分享给朋友:

相关文章

uniapp切片

uniapp切片

uniapp 切片实现方法 在 uniapp 中实现切片功能通常指的是对图片或数据进行分割处理。以下是几种常见的切片实现方式: 图片切片展示 通过 CSS 和 JavaScript 实现图片的网格化…

vue视频怎么实现

vue视频怎么实现

Vue 视频实现方法 在 Vue 中实现视频功能可以通过多种方式完成,以下是常见的几种方法: 使用 HTML5 <video> 标签 在 Vue 组件模板中直接使用 HTML5 的 &…

vue实现树形视频

vue实现树形视频

Vue 实现树形视频列表 在 Vue 中实现树形视频列表可以通过递归组件和嵌套数据结构来完成。以下是具体实现方法: 数据结构设计 使用嵌套数组表示视频分类和子视频,每个节点包含 id、name、ch…

vue实现视频id

vue实现视频id

Vue 中实现视频 ID 管理 在 Vue 中管理视频 ID 通常涉及动态绑定、状态管理和 API 交互。以下是几种常见场景的实现方法: 动态绑定视频 ID 到播放器 通过 v-bind 或 :sr…

vue实现视频流

vue实现视频流

Vue实现视频流的方法 在Vue中实现视频流通常涉及HTML5的<video>标签、WebRTC或第三方库。以下是几种常见的方法: 使用HTML5 video标签 通过HTML5的<…

vue如何实现视频

vue如何实现视频

Vue 实现视频功能的方法 在 Vue 中实现视频功能可以通过多种方式完成,以下是几种常见的方法: 使用 HTML5 <video> 标签 Vue 可以直接在模板中使用 HTML5 的…