当前位置:首页 > 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 标签实现分片播放。

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) 格式。

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

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

js实现视频切片

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

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

相关文章

vue 视频android实现

vue 视频android实现

在Vue中实现Android端的视频功能,可以通过以下方法完成,结合WebView或原生混合开发方案: 使用WebView嵌入H5视频 适用于轻量级需求,通过Vue构建H5页面,在Android W…

vue视频列表实现

vue视频列表实现

Vue 视频列表实现 数据准备 定义一个数组存储视频信息,每个视频对象包含标题、封面图、播放地址等属性。 data() { return { videos: [ {…

Vue实现换视频背景

Vue实现换视频背景

Vue实现动态视频背景 安装video.js和vue-video-player依赖 npm install video.js vue-video-player 在组件中引入并注册 import {…

vue实现视频滑入播放

vue实现视频滑入播放

实现视频滑入播放的步骤 监听滚动事件 在Vue组件中,通过mounted钩子添加滚动事件监听器,使用IntersectionObserverAPI检测视频元素是否进入视口。这种方法性能优于传统的滚动事…

vue实现实时视频

vue实现实时视频

使用 Vue 实现实时视频流 在 Vue 中实现实时视频流通常涉及浏览器 API(如 getUserMedia)和视频播放组件。以下是实现方法: 获取摄像头权限并显示视频流 通过 navigator…

vue视频列表怎么实现

vue视频列表怎么实现

Vue视频列表实现方法 数据准备 在Vue组件中定义一个数组来存储视频数据,每个视频对象包含标题、封面图、链接等属性。例如: data() { return { videos: […