如何使用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
相关产品推荐
相关产品推荐

