插件介绍
ohos_ffmpeg_kit 是一个基于 FFmpeg 的 Flutter 插件,专为鸿蒙平台优化,提供了强大的音视频处理能力。它允许开发者在 Flutter 应用中轻松执行 FFmpeg 和 FFprobe 命令,实现各种媒体处理功能。
核心特性
- 完整的 FFmpeg 和 FFprobe 支持:包含最新的 FFmpeg 6.0 版本,支持丰富的音视频处理功能
- 多平台兼容:除鸿蒙外,还支持 Android、iOS 和 macOS
- 丰富的外部库支持:
- 基础库:
dav1d,fontconfig,freetype,fribidi,gmp,gnutls等 - 音频处理:
lame,libilbc,libvorbis,opencore-amr,opus等 - 视频处理:
libass,libvpx,libwebp,snappy,zimg等 - GPL 库:
vid.stab,x264,x265,xvidcore(需使用 GPL 版本)
- 基础库:
- 灵活的包变体:提供 8 种预构建包,满足不同需求:
min:基础功能min-gpl:基础功能 + GPL 库https:基础功能 + HTTPS 支持https-gpl:基础功能 + HTTPS 支持 + GPL 库audio:专注音频处理video:专注视频处理full:完整功能full-gpl:完整功能 + GPL 库
- 双发布版本:
- Main Release:支持最新 API 特性
- LTS Release:支持更广泛的设备
如何使用插件
包的引入
由于 ohos_ffmpeg_kit 是自定义修改版本,需要以 Git 形式引入。在项目的 pubspec.yaml 文件中添加以下配置:
dependencies:
ohos_ffmpeg_kit:
git:
url: "https://github.com/your-repo/ohos_ffmpeg_kit.git"
path: "flutter/flutter"
请将 url 替换为实际的 Git 仓库地址。
API 调用
1. 执行 FFmpeg 命令
import 'package:ffmpeg_kit_flutter/ffmpeg_kit.dart';
import 'package:ffmpeg_kit_flutter/return_code.dart';
// 同步执行 FFmpeg 命令
FFmpegKit.execute('-i input.mp4 -c:v mpeg4 output.mp4').then((session) async {
final returnCode = await session.getReturnCode();
if (ReturnCode.isSuccess(returnCode)) {
// 执行成功
print('FFmpeg 命令执行成功');
} else if (ReturnCode.isCancel(returnCode)) {
// 执行被取消
print('FFmpeg 命令执行被取消');
} else {
// 执行失败
final output = await session.getOutput();
print('FFmpeg 命令执行失败: $output');
}
});
2. 异步执行 FFmpeg 命令
import 'package:ffmpeg_kit_flutter/ffmpeg_kit.dart';
import 'package:ffmpeg_kit_flutter/ffmpeg_session_complete_callback.dart';
import 'package:ffmpeg_kit_flutter/log_callback.dart';
import 'package:ffmpeg_kit_flutter/statistics_callback.dart';
import 'package:ffmpeg_kit_flutter/session.dart';
import 'package:ffmpeg_kit_flutter/log.dart';
import 'package:ffmpeg_kit_flutter/statistics.dart';
// 异步执行 FFmpeg 命令并监听回调
FFmpegKit.executeAsync(
'-i input.mp4 -c:v mpeg4 output.mp4',
// 执行完成回调
(Session session) async {
final returnCode = await session.getReturnCode();
print('异步执行完成,返回码: $returnCode');
},
// 日志回调
(Log log) {
print('FFmpeg 日志: ${log.getMessage()}');
},
// 统计信息回调
(Statistics statistics) {
print('处理进度: ${statistics.getVideoFrameNumber()} 帧');
}
);
3. 执行 FFprobe 命令
import 'package:ffmpeg_kit_flutter/ffprobe_kit.dart';
// 使用 FFprobe 获取媒体信息
FFprobeKit.execute('-i input.mp4 -print_format json -show_format -show_streams').then((session) async {
final output = await session.getOutput();
print('FFprobe 输出: $output');
});
4. 获取媒体信息(简化 API)
import 'package:ffmpeg_kit_flutter/ffprobe_kit.dart';
// 使用简化 API 获取媒体信息
FFprobeKit.getMediaInformation('input.mp4').then((session) async {
final information = await session.getMediaInformation();
if (information != null) {
// 获取格式信息
final format = information.getFormat();
print('文件名: ${format['filename']}');
print('时长: ${format['duration']} 秒');
print('文件大小: ${format['size']} 字节');
print('格式: ${format['format_name']}');
// 获取流信息
final streams = information.getStreams();
streams.forEach((stream) {
if (stream['codec_type'] == 'video') {
print('视频编码: ${stream['codec_name']}');
print('分辨率: ${stream['width']}x${stream['height']}');
print('帧率: ${stream['r_frame_rate']}');
} else if (stream['codec_type'] == 'audio') {
print('音频编码: ${stream['codec_name']}');
print('采样率: ${stream['sample_rate']}');
print('声道数: ${stream['channels']}');
}
});
}
});
5. 取消正在执行的命令
import 'package:ffmpeg_kit_flutter/ffmpeg_kit.dart';
// 取消所有正在执行的 FFmpeg 命令
FFmpegKit.cancel();
// 取消指定会话的命令(需要保存 sessionId)
// FFmpegKit.cancel(sessionId);
6. 启用全局回调
import 'package:ffmpeg_kit_flutter/ffmpeg_kit_config.dart';
import 'package:ffmpeg_kit_flutter/log_callback.dart';
import 'package:ffmpeg_kit_flutter/statistics_callback.dart';
import 'package:ffmpeg_kit_flutter/session.dart';
import 'package:ffmpeg_kit_flutter/log.dart';
import 'package:ffmpeg_kit_flutter/statistics.dart';
// 启用全局日志回调
FFmpegKitConfig.enableLogCallback((Log log) {
print('全局日志: ${log.getMessage()}');
});
// 启用全局统计信息回调
FFmpegKitConfig.enableStatisticsCallback((Statistics statistics) {
print('全局统计: 比特率 ${statistics.getBitrate()}, 速度 ${statistics.getSpeed()}x');
});
// 启用全局 FFmpeg 会话完成回调
FFmpegKitConfig.enableFFmpegSessionCompleteCallback((Session session) async {
print('FFmpeg 会话完成,ID: ${session.getSessionId()}');
});
常见使用场景
1. 视频格式转换
FFmpegKit.execute('-i input.mp4 -c:v libx264 -c:a aac output.mp4');
2. 视频裁剪
FFmpegKit.execute('-i input.mp4 -ss 00:00:10 -t 00:00:30 -c copy output.mp4');
3. 视频压缩
FFmpegKit.execute('-i input.mp4 -c:v libx264 -crf 28 -c:a aac -b:a 128k output.mp4');
4. 音频提取
FFmpegKit.execute('-i input.mp4 -vn -c:a copy output.aac');
5. 音频格式转换
FFmpegKit.execute('-i input.mp3 -c:a aac output.aac');
注意事项
- 权限问题:确保应用具有读取和写入存储的权限
- 性能考虑:复杂的音视频处理可能会消耗大量资源,建议在后台线程执行
- 错误处理:始终检查命令执行的返回码和错误信息
- GPL 许可:如果使用了包含 GPL 库的包变体,请注意应用的许可协议
- 版本兼容性:确保使用与目标鸿蒙版本兼容的插件版本
总结
ohos_ffmpeg_kit 为 Flutter 开发者提供了在鸿蒙平台上强大的音视频处理能力。通过简单的 API 调用,开发者可以轻松实现各种媒体处理功能,如格式转换、视频裁剪、音频提取等。插件支持多种包变体,可以根据项目需求选择合适的版本,同时提供了同步和异步执行方式,以及丰富的回调接口,方便开发者监控和控制处理过程。
无论是构建视频编辑应用、音视频转码工具,还是需要简单媒体处理功能的应用,ohos_ffmpeg_kit 都是一个值得考虑的选择。
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.youkuaiyun.com

被折叠的 条评论
为什么被折叠?



