当前位置:首页 > 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

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

js实现视频切片

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

相关文章

css帧动画制作视频

css帧动画制作视频

CSS帧动画制作方法 CSS帧动画通过@keyframes规则和animation属性实现,以下是具体步骤: 定义关键帧 使用@keyframes定义动画序列,从0%到100%描述每一帧的状态:…

vue实现视频通话

vue实现视频通话

Vue实现视频通话的方法 使用WebRTC技术 WebRTC是一种支持浏览器之间实时通信的技术,无需插件即可实现视频通话。Vue可以结合WebRTC的API实现视频通话功能。 安装必要的依赖库:…

h5实现实时视频通话

h5实现实时视频通话

实现H5实时视频通话的技术方案 WebRTC是实现H5实时视频通话的核心技术,无需插件即可在浏览器中实现点对点通信。以下是关键实现步骤: 基础环境准备 确保使用支持WebRTC的现代浏览器(Chro…

vue实现缓存视频

vue实现缓存视频

Vue 实现视频缓存的方法 在 Vue 中实现视频缓存可以通过多种方式完成,包括使用浏览器的缓存机制、Service Worker 或者借助第三方库。以下是几种常见的方法: 使用 Service W…

vue实现上传视频

vue实现上传视频

使用 <input type="file"> 实现基础上传 通过 HTML 原生文件选择控件获取视频文件,结合 Vue 处理上传逻辑。 <template> <…

vue实现直播视频

vue实现直播视频

Vue 实现直播视频的技术方案 方案一:基于 H5 的 video 标签与 MSE(Media Source Extensions) 使用 H5 的 <video> 标签结合 MSE…