鸿蒙 Flutter 实战:video_compress 3.1.4 适配 3.27-ohos 全流程

摘要

在鸿蒙(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 版本:

bash 复制代码
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 get、analyze、build hap。
  4. 扩展 example 为功能演示页,真机验证压缩 / 缩略图 / 媒体信息。

工程关键目录:

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

四、接入项目

4.1 添加依赖

在业务工程 pubspec.yaml 中:

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。

bash 复制代码
flutter pub get

4.2 代码示例

dart 复制代码
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

bash 复制代码
cd example
flutter pub get
flutter build hap --debug

成功时可看到类似输出:

text 复制代码
✓ Built ohos/entry/build/default/outputs/default/entry-default-signed.hap

5.2 DevEco 签名目录

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

text 复制代码
example/ohos/

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


六、真机功能验证(Demo)

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

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

参数单位(鸿蒙实现)

参数 单位 备注
缩略图 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。

十、参考链接


相关推荐
梦想不只是梦与想11 小时前
HarmonyOS应用分层架构设计
harmonyos·分层架构·一次开发,多端部署
MardaWang14 小时前
当滚动逃离了框架 ——HarmonyOS Web 与原生混排滚动的冲突本质与解法
harmonyos·arkts·鸿蒙·deveco studio
tsqtsqtsq030915 小时前
DevEco Studio 介绍
harmonyos
传奇开心果编程17 小时前
【现代声明式UI学与练】第4课 列表渲染与 key——如何高效渲染列表、key 的作用、列表重排时的状态保持
学习·flutter·react native·ui·swiftui·android jetpack
HwJack2018 小时前
【共创稿事节】HarmonyOS 7文旅展陈展厅大空间 3DGS 重建的分块策略与拼接踩坑
3d·华为·harmonyos
熊猫钓鱼>_>20 小时前
Kotlin Multiplatform for OpenHarmony 实战:为 kotlin-inject 实现依赖注入适配
开发语言·华为·kotlin·ai编程·inject·鸿蒙·openharmony
m0_7381858220 小时前
Flutter 鸿蒙化实战:media_info 适配 OpenHarmony,媒体信息与缩略图
flutter·华为·harmonyos·鸿蒙·媒体
m0_7381858221 小时前
Flutter 鸿蒙化实战:just_audio 适配 OpenHarmony,功能强大的播放器
flutter·华为·harmonyos·鸿蒙
翼辉cto21 小时前
Kotlin Multiplatform 三方库 SQLDelight 的 OpenHarmony 鸿蒙化适配实战
开发语言·kotlin·harmonyos