1. 插件介绍

fluttertpc_media_info 是一款专为鸿蒙系统适配的 Flutter 媒体信息处理插件,基于原生 media_info 开发。该插件提供了强大的媒体文件处理能力,包括媒体信息获取和缩略图生成功能,适用于需要处理图片、音频和视频文件的各类应用场景。

核心功能

  • 媒体信息获取:支持获取图片、音频和视频文件的详细信息,如分辨率、时长、帧率、比特率、MIME 类型等
  • 缩略图生成:支持为视频或图片文件生成指定尺寸的缩略图,可自定义缩略图的宽高和生成位置
  • 多类型支持:兼容常见的图片格式(JPG、PNG 等)、音频格式和视频格式
  • 鸿蒙系统优化:针对鸿蒙系统特性进行了专门适配,确保在鸿蒙设备上的稳定运行

应用场景

  • 媒体播放器应用:显示媒体文件的详细信息和缩略图
  • 相册应用:批量生成图片和视频缩略图
  • 视频编辑应用:在时间轴上显示视频帧缩略图
  • 文件管理器:为媒体文件提供预览功能

2. 安装与配置

2.1 添加依赖

在 Flutter 项目的 pubspec.yaml 文件中添加以下依赖配置:

dependencies:
  media_info:
    git:
      url: "https://gitcode.com/openharmony-sig/fluttertpc_media_info.git"

2.2 安装依赖

执行以下命令安装插件:

flutter pub get

3. API 调用示例

3.1 初始化插件

import 'package:media_info/media_info.dart';

// 创建 MediaInfo 实例
final MediaInfo _mediaInfo = MediaInfo();

3.2 获取媒体信息

// 获取媒体文件信息
Future<void> getMediaDetails(String filePath) async {
  try {
    final Map<String, dynamic> mediaInfo = await _mediaInfo.getMediaInfo(filePath);

    // 打印媒体信息
    print('媒体类型: ${mediaInfo['mimeType']}');

    // 图片信息
    if (mediaInfo['mimeType']?.startsWith('image') == true) {
      print('分辨率: ${mediaInfo['width']}x${mediaInfo['height']}');
    }

    // 视频信息
    if (mediaInfo['mimeType']?.startsWith('video') == true) {
      print('分辨率: ${mediaInfo['width']}x${mediaInfo['height']}');
      print('时长: ${mediaInfo['durationMs']} 毫秒');
      print('帧率: ${mediaInfo['frameRate']}');
      print('轨道数: ${mediaInfo['numTracks']}');
    }

    // 音频信息
    if (mediaInfo['mimeType']?.startsWith('audio') == true) {
      print('时长: ${mediaInfo['durationMs']} 毫秒');
      print('比特率: ${mediaInfo['bitrate']}');
    }

  } catch (e) {
    print('获取媒体信息失败: $e');
  }
}

3.3 生成缩略图

import 'dart:io';
import 'package:path_provider/path_provider.dart';

// 生成缩略图
Future<String?> generateMediaThumbnail(String filePath, int width, int height, {int positionMs = 0}) async {
  try {
    // 获取临时目录
    final Directory tempDir = await getTemporaryDirectory();

    // 生成输出文件路径
    final String outputPath = File('${tempDir.path}/thumbnail_${DateTime.now().millisecondsSinceEpoch}.jpg').path;

    // 生成缩略图
    final String thumbnailPath = await _mediaInfo.generateThumbnail(
      filePath,         // 输入文件路径
      outputPath,       // 输出文件路径
      width,            // 缩略图宽度
      height,           // 缩略图高度
      positionMs: positionMs,  // 生成缩略图的时间点(毫秒,仅对视频有效)
    );

    print('缩略图生成成功: $thumbnailPath');
    return thumbnailPath;

  } catch (e) {
    print('生成缩略图失败: $e');
    return null;
  }
}

3.4 完整示例

以下是一个完整的示例,展示如何选择文件、获取媒体信息并生成缩略图:

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:file_picker/file_picker.dart';
import 'package:path_provider/path_provider.dart';
import 'package:media_info/media_info.dart';

class MediaInfoExample extends StatefulWidget {
  
  _MediaInfoExampleState createState() => _MediaInfoExampleState();
}

class _MediaInfoExampleState extends State<MediaInfoExample> {
  String? _selectedFilePath;
  Map<String, dynamic>? _mediaInfo;
  String? _thumbnailPath;
  final MediaInfo _mediaInfoPlugin = MediaInfo();

  // 选择文件
  Future<void> _selectFile() async {
    final FilePickerResult? result = await FilePicker.platform.pickFiles(
      type: FileType.media,
    );

    if (result != null) {
      setState(() {
        _selectedFilePath = result.files.single.path;
        _mediaInfo = null;
        _thumbnailPath = null;
      });

      // 获取媒体信息
      await _getMediaInfo();

      // 生成缩略图
      await _generateThumbnail();
    }
  }

  // 获取媒体信息
  Future<void> _getMediaInfo() async {
    if (_selectedFilePath == null) return;

    try {
      final info = await _mediaInfoPlugin.getMediaInfo(_selectedFilePath!);
      setState(() {
        _mediaInfo = info;
      });
    } catch (e) {
      print('获取媒体信息失败: $e');
    }
  }

  // 生成缩略图
  Future<void> _generateThumbnail() async {
    if (_selectedFilePath == null) return;

    try {
      final tempDir = await getTemporaryDirectory();
      final outputPath = File('${tempDir.path}/thumbnail.jpg').path;

      final path = await _mediaInfoPlugin.generateThumbnail(
        _selectedFilePath!,
        outputPath,
        320,
        180,
        positionMs: 1000, // 视频开始1秒处生成缩略图
      );

      setState(() {
        _thumbnailPath = path;
      });
    } catch (e) {
      print('生成缩略图失败: $e');
    }
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('媒体信息示例')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: _selectFile,
              child: Text('选择媒体文件'),
            ),
            SizedBox(height: 20),
            if (_mediaInfo != null) ...[
              Text('媒体信息:'),
              Text('类型: ${_mediaInfo!['mimeType']}'),
              if (_mediaInfo!['width'] != null && _mediaInfo!['height'] != null)
                Text('分辨率: ${_mediaInfo!['width']}x${_mediaInfo!['height']}'),
              if (_mediaInfo!['durationMs'] != null)
                Text('时长: ${_mediaInfo!['durationMs']} 毫秒'),
              if (_mediaInfo!['frameRate'] != null)
                Text('帧率: ${_mediaInfo!['frameRate']}'),
              if (_mediaInfo!['bitrate'] != null)
                Text('比特率: ${_mediaInfo!['bitrate']}'),
            ],
            SizedBox(height: 20),
            if (_thumbnailPath != null)
              Image.file(File(_thumbnailPath!))
          ],
        ),
      ),
    );
  }
}

4. 注意事项

  1. 文件路径格式:传入的文件路径必须是绝对路径,且不能包含 file:// 前缀

  2. 权限要求

    • 在鸿蒙系统上,需要在 module.json5 文件中添加文件访问权限
    • 对于外部存储的文件,需要申请读写权限
  3. 性能优化

    • 生成缩略图时,建议根据实际需求选择合适的尺寸,避免生成过大的缩略图影响性能
    • 对于大量媒体文件的处理,建议使用异步方式并添加适当的错误处理
  4. 兼容性

    • 已在 Flutter 3.7.12-ohos-1.0.6 和 3.22.1-ohos-1.0.1 版本上测试通过
    • 支持鸿蒙系统 SDK 5.0.0(12) 及以上版本

5. 总结

fluttertpc_media_info 是一款功能强大的媒体信息处理插件,专为鸿蒙系统进行了优化适配。通过该插件,开发者可以轻松实现媒体信息获取和缩略图生成功能,为应用添加丰富的媒体处理能力。

该插件具有以下优势:

  • 简单易用的 API 接口,便于集成到各种 Flutter 项目中
  • 全面的媒体信息获取能力,满足不同应用的需求
  • 灵活的缩略图生成功能,支持自定义尺寸和生成位置
  • 针对鸿蒙系统进行了专门优化,确保稳定运行

无论是开发媒体播放器、相册应用还是视频编辑工具,fluttertpc_media_info 都是一个值得信赖的选择。

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

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐