Flutter音频元数据读取插件audio_metadata_reader的使用

Flutter音频元数据读取插件audio_metadata_reader的使用

audio_metadata_reader 是一个纯Dart包,用于读取和写入不同音频格式的元数据。虽然该包目前仅支持读取功能,但其支持多种常见的音频文件格式及其对应的元数据格式,如下表所示:

文件格式 元数据格式(s)
MP3 ID3v1 ID3v2 ID3v3 ID3v4
MP4 iTunes-style ilst
FLAC Vorbis Comments
OGG Vorbis Comments
Opus Vorbis Comments

使用方法

示例代码

以下是一个简单的例子,展示了如何使用 audio_metadata_reader 插件来读取音频文件的元数据。

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

Future<void> main() async {
  // 指定音频文件路径
  final track = File("path/to/Pieces.mp3");

  // 读取元数据,不获取封面图片以加快读取速度
  final metadata = await readMetadata(track, getImage: false);

  // 输出音频文件的标题、专辑名称等信息
  print('Title: ${metadata.title}');
  print('Album: ${metadata.album}');
  print('Duration: ${metadata.duration}');
  // 可以继续输出其他元数据信息...
}

性能测试

在性能方面,根据官方提供的示例代码,在SSD硬盘上运行时,如果不对封面进行读取操作,则可以在不到200毫秒内完成对3392首曲目的元数据读取;而当包含封面读取时,大约需要400毫秒左右。以下是性能测试的代码片段:

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

void main() {
  // 指定音乐文件夹路径,并筛选出支持的音频格式文件
  final folder = Directory(r"path/to/music/folder")
      .listSync(recursive: true)
      .whereType<File>()
      .where((element) =>
          element.path.toLowerCase().endsWith(".mp4") ||
          element.path.toLowerCase().endsWith(".m4a") ||
          element.path.toLowerCase().endsWith(".mp3") ||
          element.path.toLowerCase().endsWith(".flac"))
      .toList();

  print("Number of tracks: ${folder.length}");

  final init = DateTime.now();

  for (final file in folder) {
    readMetadata(file, getImage: false);
  }

  final end = DateTime.now();

  print('Time taken: ${end.difference(init)}');
}

请注意,在实际项目中,你需要将 "path/to/Pieces.mp3""path/to/music/folder" 替换为你的实际文件路径或目录路径。此外,确保你已经在 pubspec.yaml 文件中添加了 audio_metadata_reader 的依赖项。

通过上述内容,你应该能够顺利地开始使用 audio_metadata_reader 插件来读取音频文件中的元数据了。如果你遇到了任何问题或者有新的需求,可以通过GitHub仓库提交issue与开发者交流。


更多关于Flutter音频元数据读取插件audio_metadata_reader的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter音频元数据读取插件audio_metadata_reader的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用audio_metadata_reader插件来读取音频元数据的示例代码。假设你已经在pubspec.yaml文件中添加了该插件的依赖,并且已经运行了flutter pub get

首先,确保你的pubspec.yaml文件中包含以下依赖项:

dependencies:
  flutter:
    sdk: flutter
  audio_metadata_reader: ^最新版本号  # 请替换为实际的最新版本号

然后,按照以下步骤在Flutter项目中实现音频元数据的读取功能:

  1. 导入必要的包

在你的Dart文件中(例如main.dart),导入audio_metadata_reader包:

import 'package:flutter/material.dart';
import 'package:audio_metadata_reader/audio_metadata_reader.dart';
import 'dart:io';
  1. 选择音频文件

使用FilePicker或类似的插件来选择音频文件。这里假设你已经有一个文件路径filePath

  1. 读取音频元数据

使用AudioMetadataReader读取音频文件的元数据:

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Audio Metadata Reader'),
        ),
        body: Center(
          child: AudioMetadataScreen(),
        ),
      ),
    );
  }
}

class AudioMetadataScreen extends StatefulWidget {
  @override
  _AudioMetadataScreenState createState() => _AudioMetadataScreenState();
}

class _AudioMetadataScreenState extends State<AudioMetadataScreen> {
  String? filePath;
  Map<String, dynamic>? metadata;

  void _pickFile() async {
    // 这里使用了一个简单的文件选择器示例,实际项目中可能需要使用更复杂的文件选择逻辑
    FilePickerResult? result = await FilePicker.platform.pickFiles(
      type: FileType.audio,
    );

    if (result != null && result.files.isNotEmpty) {
      File file = File(result.files.first.path!);
      setState(() {
        filePath = file.path;
      });

      _readMetadata(file);
    }
  }

  void _readMetadata(File file) async {
    try {
      metadata = await AudioMetadataReader.readMetadata(file);
      setState(() {});
    } catch (e) {
      print("Error reading metadata: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        ElevatedButton(
          onPressed: _pickFile,
          child: Text('Pick Audio File'),
        ),
        if (filePath != null)
          Text('Selected File: $filePath'),
        if (metadata != null)
          Padding(
            padding: const EdgeInsets.all(16.0),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                Text('Metadata:', style: TextStyle(fontWeight: FontWeight.bold)),
                Text('Title: ${metadata!['title']}'),
                Text('Artist: ${metadata!['artist']}'),
                Text('Album: ${metadata!['album']}'),
                Text('Duration: ${metadata!['duration']?.inSeconds} seconds'),
                // 根据实际读取到的元数据字段进行展示
              ],
            ),
          ),
      ],
    );
  }
}

注意

  1. 上面的代码示例中使用了FilePicker插件来选择文件。你需要先在pubspec.yaml中添加file_picker依赖,并运行flutter pub get

  2. AudioMetadataReader.readMetadata(file) 方法返回一个包含音频元数据的Map。实际可用的元数据字段取决于音频文件的格式和内容。

  3. 在实际项目中,你可能需要处理更多的错误情况,例如文件读取权限问题、文件格式不支持等。

  4. audio_metadata_reader插件的具体API和使用方法可能会随着版本更新而变化,请参考插件的官方文档获取最新信息。

希望这段代码示例能帮助你在Flutter项目中实现音频元数据的读取功能。

回到顶部