You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用node-fluent-ffmpeg将大视频按固定大小分割为小视频分片

如何使用node-fluent-ffmpeg将大视频按固定大小分割为多个小视频

错误原因说明

直接对原始视频字节流做切割的方式不可行:MP4是结构化的容器格式,每个可独立播放的分片都需要包含完整的文件头、元数据,且分片起始位置必须是关键帧,手动切割字节必然导致分片缺少必要信息无法播放。

正确实现方案

直接调用ffmpeg原生的分片能力,通过node-fluent-ffmpeg封装参数即可,无需手动处理流切割,生成的所有分片都可独立播放。

步骤1:安装依赖

npm install fluent-ffmpeg fs-extra

注意:需要本地环境已安装ffmpeg并配置到系统环境变量中。

步骤2:实现代码

const ffmpeg = require('fluent-ffmpeg');
const fs = require('fs-extra');
const path = require('path');

// 自定义配置
const inputFile = './data/test.mp4';
const outputDir = './split';
const maxPieceSize = 1024 * 1024 * 100; // 单分片最大100MB,可自行调整
const outputPattern = path.join(outputDir, 'part_%d.mp4'); // 分片命名规则,%d为自动递增的序号

// 自动创建输出目录
fs.ensureDirSync(outputDir);

ffmpeg(inputFile)
  .outputOptions([
    '-f segment', // 开启分片输出模式
    `-segment_size ${maxPieceSize}`, // 单分片最大字节数
    '-c copy', // 音视频流直接复制,不重新编码,处理速度极快
    '-reset_timestamps 1' // 每个分片重置时间戳,保证分片可独立播放
  ])
  .output(outputPattern)
  .on('progress', (progress) => {
    console.log(`处理进度:${progress.percent ? progress.percent.toFixed(2) : '计算中'}%`);
  })
  .on('end', () => {
    console.log('视频分片完成,所有分片均存储在split目录下');
  })
  .on('error', (err) => {
    console.error('分片处理失败:', err.message);
  })
  .run();

注意事项

  • 如果发现实际分片大小和设置的最大值偏差较大,是因为原始视频的关键帧间隔太大,ffmpeg只能在关键帧位置切割分片。如果需要更高的大小精度,可以去掉-c copy参数,换成转码参数-c:v libx264 -g 30 -c:a aac,强制每30帧一个关键帧,不过处理速度会变慢。
  • 生成的分片可以直接用ffmpeg合并回原视频,不需要额外处理。

内容的提问来源于stack exchange,提问作者radiorz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 14:54:06