在鸿蒙上使用 ohos_ffmpeg_kit Flutter 插件

插件介绍

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');

注意事项

  1. 权限问题:确保应用具有读取和写入存储的权限
  2. 性能考虑:复杂的音视频处理可能会消耗大量资源,建议在后台线程执行
  3. 错误处理:始终检查命令执行的返回码和错误信息
  4. GPL 许可:如果使用了包含 GPL 库的包变体,请注意应用的许可协议
  5. 版本兼容性:确保使用与目标鸿蒙版本兼容的插件版本

总结

ohos_ffmpeg_kit 为 Flutter 开发者提供了在鸿蒙平台上强大的音视频处理能力。通过简单的 API 调用,开发者可以轻松实现各种媒体处理功能,如格式转换、视频裁剪、音频提取等。插件支持多种包变体,可以根据项目需求选择合适的版本,同时提供了同步和异步执行方式,以及丰富的回调接口,方便开发者监控和控制处理过程。

无论是构建视频编辑应用、音视频转码工具,还是需要简单媒体处理功能的应用,ohos_ffmpeg_kit 都是一个值得考虑的选择。

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.youkuaiyun.com

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值