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

Flutter中如何拆分视频文件为多段并上传至服务器?是否可行?

Flutter实现视频文件拆分方案

1. 基于文件字节的简单拆分(适合无需保证片段可独立播放的场景)

这种方式不解析视频编码,仅按固定字节大小切割文件,适合上传后由服务器合并的场景。

  • 核心逻辑:读取视频文件的字节流,按设定的分片大小(如10MB)分割为多个字节块,再分别保存为小文件。
  • 示例代码:
import 'dart:io';

Future<List<File>> splitVideoByBytes(File videoFile, int chunkSizeInBytes) async {
  List<File> chunks = [];
  final fileLength = await videoFile.length();
  int startOffset = 0;
  
  while (startOffset < fileLength) {
    int endOffset = startOffset + chunkSizeInBytes;
    if (endOffset > fileLength) endOffset = fileLength;
    
    final chunkBytes = await videoFile.readAsBytes().then((bytes) => bytes.sublist(startOffset, endOffset));
    final chunkFile = File('${videoFile.path}_chunk_${startOffset ~/ chunkSizeInBytes}');
    await chunkFile.writeAsBytes(chunkBytes);
    
    chunks.add(chunkFile);
    startOffset = endOffset;
  }
  
  return chunks;
}

注意:拆分出的片段无法直接播放,仅用于上传后服务器端合并还原完整视频。

2. 基于视频编码的帧级拆分(保证片段可独立播放)

如果需要拆分后的片段能单独播放,需借助视频处理工具解析编码,按时间轴精准切割。

  • 可以使用ffmpeg_kit_flutter(FFmpeg的Flutter封装库),通过FFmpeg命令实现:
    示例代码:
import 'package:ffmpeg_kit_flutter/ffmpeg_kit.dart';
import 'package:ffmpeg_kit_flutter/return_code.dart';

Future<void> splitVideoByTime(String inputPath, String outputPath, int startTime, int duration) async {
  // FFmpeg命令:从startTime秒开始,截取duration时长的视频,直接复制音视频流以提升速度
  final command = '-i $inputPath -ss $startTime -t $duration -c:v copy -c:a copy $outputPath';
  final session = await FFmpegKit.execute(command);
  
  final returnCode = await session.getReturnCode();
  if (ReturnCode.isSuccess(returnCode)) {
    print('视频片段生成成功');
  } else {
    print('视频片段生成失败');
  }
}
  • 说明:-c:v copy -c:a copy参数跳过重新编码,速度更快;若需要调整编码格式或分辨率,可移除该参数并指定对应编码配置。

补充说明

你提到未找到专门的拆分插件,实际上无需依赖专门插件,上述两种方案即可覆盖不同场景:前者靠Dart原生文件IO就能实现,后者借助FFmpeg封装库即可完成专业的视频切割需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 19:57:45