摘要

在鸿蒙(OpenHarmony)Flutter 3.27-ohos 生态下,社区已有针对较老 SDK 的 fluttertpc_video_compress 适配。本文记录在 Flutter 3.27.5-ohos-1.0.3 上,将上游 video_compress ^3.1.4 跑通并完成真机验证的过程,涵盖环境、构建、Demo 功能测试与依赖接入。

开源仓库https://gitcode.com/xiaoyangming/flutter_video_compress_ohos


一、为什么要做这件事?

video_compress 是 Flutter 侧常用的视频处理插件,主要能力包括:

能力 说明
视频压缩 缩小体积,可选画质、帧率、是否保留音频、裁剪时间段
缩略图 getByteThumbnail(内存)、getFileThumbnail(文件)
媒体信息 getMediaInfo 读取宽高、时长、大小等

业务里常见场景:用户选视频 → 压缩后上传、生成封面图、展示视频信息。

鸿蒙 Flutter 使用 ohos 平台实现,不能直接用 pub.dev 上未适配鸿蒙的版本。参考仓基于 3.7-ohos 等版本已有实现,本文目标是在 3.27-ohos 上复用并验证。

在这里插入图片描述


二、环境与参考

2.1 开发环境

版本 / 说明
Flutter 3.27.5-ohos-1.0.3
Dart 3.6.2
命令 flutter(本地若用 FVM,将下文 flutter 改为 fvm flutter 即可)
IDE DevEco Studio(鸿蒙签名、真机调试)

验证 Flutter 版本:

flutter --version

在这里插入图片描述

2.2 参考与发布仓库

仓库 作用
CPF-Flutter/fluttertpc_video_compress 已有鸿蒙适配,作实现参考
xiaoyangming/flutter_video_compress_ohos 本文适配成果对外发布
pub.dev/video_compress 上游 Dart API(3.1.4)

三、适配思路(3.27-ohos)

整体不是从零写插件,而是:

  1. 以社区 fluttertpc_video_compress 为基线(含 ohos/ ArkTS + FFmpeg 原生实现)。
  2. 对齐上游包版本 3.1.4,放宽 Dart SDK 约束以支持 Dart 3.x。
  3. 3.27.5-ohos-1.0.3 下执行 pub getanalyzebuild hap
  4. 扩展 example 为功能演示页,真机验证压缩 / 缩略图 / 媒体信息。

工程关键目录:

flutter_video_compress_ohos/
├── lib/                 # Dart API(包名仍为 video_compress)
├── ohos/                # 鸿蒙 HAR、转码原生实现
├── example/
│   ├── lib/demo_page.dart   # 功能演示
│   └── ohos/                # 示例 App,在此配置签名
└── pubspec.yaml

四、接入项目

4.1 添加依赖

在业务工程 pubspec.yaml 中:

dependencies:
  video_compress:
    git:
      url: https://gitcode.com/xiaoyangming/flutter_video_compress_ohos.git
      ref: v3.1.4-ohos-3.27

说明:Git 仓库名是 flutter_video_compress_ohos,Dart package 名仍是 video_compress,无需改 import。

flutter pub get

4.2 代码示例

import 'package:video_compress/video_compress.dart';

// 媒体信息
final info = await VideoCompress.getMediaInfo(videoPath);

// 文件缩略图(position 单位为毫秒)
final thumbFile = await VideoCompress.getFileThumbnail(
  videoPath,
  quality: 80,
  position: 0,
);

// 内存缩略图
final thumbBytes = await VideoCompress.getByteThumbnail(
  videoPath,
  quality: 80,
  position: 0,
);

// 视频压缩(鸿蒙侧 startTime/duration 为秒,见下文说明)
final out = await VideoCompress.compressVideo(
  videoPath,
  quality: VideoQuality.MediumQuality,
  includeAudio: true,
  frameRate: 30,
  startTime: 0,
  duration: 10,
);

五、构建与签名

5.1 编译 HAP

cd example
flutter pub get
flutter build hap --debug

成功时可看到类似输出:

✓ Built ohos/entry/build/default/outputs/default/entry-default-signed.hap

在这里插入图片描述

5.2 DevEco 签名目录

签名请在 example 的鸿蒙工程 配置,不是插件根目录的 ohos/

example/ohos/

步骤:File → Project Structure → Signing Configs → Automatically generate signature

在这里插入图片描述


六、真机功能验证(Demo)

仓库 example 提供 「video_compress 功能演示」 页面。

步骤 操作 对应 API
1 选择视频(相册)
2 获取 MediaInfo getMediaInfo
3 内存缩略图 / 文件缩略图 getByteThumbnail / getFileThumbnail
4 配置画质、帧率、音频、起止时间后压缩 compressVideo

Demo 首页,已选视频路径

MediaInfo 结果日志

缩略图预览(内存或文件)

压缩参数界面 + 压缩完成日志

参数单位(鸿蒙实现)

参数 单位 备注
缩略图 position 毫秒 与 Dart 文档一致
压缩 startTime / duration 对应原生 FFmpeg -ss / -t
duration 不传或关闭「限制时长」 压到视频结尾 原生侧 duration = -1

3.27-ohos 已验证项

  • flutter pub get / analyze 无 error
  • flutter build hap --debug 成功
  • 真机 Demo:媒体信息、缩略图、压缩

七、与参考仓的差异说明

对比项 参考仓(3.7 / 3.35 等) 本文(3.27-ohos)
Flutter SDK 文档列 3.7.12 / 3.35.8 等 3.27.5-ohos-1.0.3
包版本 3.1.2 等 对齐 3.1.4
Dart SDK 旧约束 >=3.0.0 <4.0.0
Example 功能较简 增加 demo_page 全量演示

鸿蒙 API 支持情况(与参考仓一致,节选):

API ohos
compressVideo
getByteThumbnail / getFileThumbnail
getMediaInfo

八、常见问题

Q1:build hap 提示配置签名?
在 DevEco 打开 example/ohos,配置自动签名后重试。

Q2:依赖报错找不到 video_compress
确认 git 地址为 flutter_video_compress_ohos,且已 flutter pub get

Q3:压缩很慢?
参考仓历史 commit 曾标注 ohos 转码性能 TODO,大文件请真机实测耗时。

Q4:和 pub.dev 原版能混用吗?
鸿蒙工程请只用本 git 依赖;Android/iOS 若用原版需按平台拆分依赖(本文未展开)。


九、总结

  • Flutter 3.27.5-ohos-1.0.3 上,基于社区 fluttertpc_video_compress 完成 video_compress 3.1.4 适配。
  • 提供可运行的 example Demo 与对外仓库 flutter_video_compress_ohos
  • 核心业务可按本文接入:getMediaInfo、缩略图、compressVideo

十、参考链接


Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐