Flutter音频标签处理插件audiotags的使用

发布于 1周前 作者 bupafengyu 来自 Flutter

Flutter音频标签处理插件audiotags的使用

AudioTags 是一个用于在Flutter应用中读取和写入音频元数据的插件,支持多种音频格式。本文将介绍如何使用该插件,并提供一个完整的示例。

使用方法

读取音频标签

要读取音频文件的元数据,可以使用 AudioTags.read(path) 方法。下面是一个简单的例子:

import 'package:audiotags/audiotags.dart';

// 假设我们有一个音频文件路径
String path = "path/to/audio/file.mp3";

// 读取音频标签
Tag? tag = await AudioTags.read(path);

if (tag != null) {
    String? title = tag.title;
    String? trackArtist = tag.trackArtist;
    String? album = tag.album;
    String? albumArtist = tag.albumArtist;
    String? genre = tag.genre;
    int? year = tag.year;
    int? trackNumber = tag.trackNumber;
    int? trackTotal = tag.trackTotal;
    int? discNumber = tag.discNumber;
    int? discTotal = tag.discTotal;
    int? duration = tag.duration;
    List<Picture>? pictures = tag.pictures;

    print("Title: $title");
    print("Track Artist: $trackArtist");
    print("Album: $album");
    print("Album Artist: $albumArtist");
    print("Genre: $genre");
    print("Year: $year");
    print("Track Number: $trackNumber");
    print("Track Total: $trackTotal");
    print("Disc Number: $discNumber");
    print("Disc Total: $discTotal");
    print("Duration: $duration");
    print("Pictures: $pictures");
}

写入音频标签

要写入音频文件的元数据,可以使用 AudioTags.write(path, tag) 方法。以下是如何创建并写入一个新的 Tag 对象的例子:

import 'package:audiotags/audiotags.dart';

// 创建一个新的Tag对象
Tag tag = Tag(
    title: "Title",
    trackArtist: "Track Artist",
    album: "Album",
    albumArtist: "Album Artist",
    genre: "Genre",
    year: 2000,
    trackNumber: 1,
    trackTotal: 2,
    discNumber: 1,
    discTotal: 3,
    pictures: [
        Picture(
            bytes: Uint8List.fromList([0, 0, 0, 0]),
            mimeType: null,
            pictureType: PictureType.other
        )
    ]
);

// 假设我们有一个音频文件路径
String path = "path/to/audio/file.mp3";

// 写入音频标签
await AudioTags.write(path, tag);

支持的格式

该插件依赖于Rust库 lofty 来读取和写入元数据。支持的音频格式列表可以在 这里 查看。

完整示例 Demo

以下是完整的示例代码,包含用户界面、选择文件、读取和写入功能:

import 'dart:io';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:audiotags/audiotags.dart';
import 'package:permission_handler/permission_handler.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String path = "";

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('AudioTags Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                child: const Text("Open"),
                onPressed: () async {
                  if (Platform.isAndroid || Platform.isIOS) {
                    await Permission.storage.request();
                  }
                  FilePickerResult? r = await FilePicker.platform.pickFiles();
                  if (r != null) path = r.files.single.path!;
                },
              ),
              const SizedBox(height: 10),
              ElevatedButton(
                child: const Text("Write"),
                onPressed: () async {
                  Tag tag = Tag(
                      title: "Title",
                      trackArtist: "Track Artist",
                      album: "Album",
                      albumArtist: "Album Artist",
                      genre: "Genre",
                      year: 2000,
                      trackNumber: 1,
                      trackTotal: 2,
                      discNumber: 1,
                      discTotal: 3,
                      pictures: [
                        Picture(
                            bytes: Uint8List.fromList([0, 0, 0, 0]),
                            mimeType: null,
                            pictureType: PictureType.other)
                      ]);
                  await AudioTags.write(path, tag);
                },
              ),
              const SizedBox(height: 10),
              ElevatedButton(
                child: const Text("Read"),
                onPressed: () async {
                  Tag? tag = await AudioTags.read(path);
                  if (tag != null) {
                    debugPrint("Title: ${tag.title}");
                    debugPrint("Track Artist: ${tag.trackArtist}");
                    debugPrint("Album: ${tag.album}");
                    debugPrint("Album Artist: ${tag.albumArtist}");
                    debugPrint("Genre: ${tag.genre}");
                    debugPrint("Year: ${tag.year}");
                    debugPrint("Track Number: ${tag.trackNumber}");
                    debugPrint("Track Total: ${tag.trackTotal}");
                    debugPrint("Disc Number: ${tag.discNumber}");
                    debugPrint("Disc Total: ${tag.discTotal}");
                    debugPrint("Duration: ${tag.duration}");
                    debugPrint("Pictures: ${tag.pictures}");
                  }
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

这个示例展示了如何在Flutter应用中使用 audiotags 插件来处理音频文件的元数据。通过这种方式,你可以轻松地在你的应用程序中添加对音频文件的支持。


更多关于Flutter音频标签处理插件audiotags的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter音频标签处理插件audiotags的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用audiotags插件来处理音频标签的一个代码案例。audiotags插件允许你读取和写入MP3文件的ID3标签。

首先,确保你已经在pubspec.yaml文件中添加了audiotags依赖:

dependencies:
  flutter:
    sdk: flutter
  audiotags: ^2.2.1  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

以下是一个简单的示例,展示了如何读取和写入音频文件的标签:

import 'package:flutter/material.dart';
import 'package:audiotags/audiotags.dart';
import 'package:path_provider/path_provider.dart';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String? title;
  String? artist;
  String? album;
  String? filePath;

  @override
  void initState() {
    super.initState();
    _readFileTags();
  }

  Future<void> _readFileTags() async {
    // 获取应用的文档目录
    final directory = await getApplicationDocumentsDirectory();
    // 假设你有一个名为"example.mp3"的音频文件在这个目录下
    final mp3Path = directory.path + '/example.mp3';

    // 使用audiotags插件读取标签
    final tags = await AudioTags.from(mp3Path);
    
    setState(() {
      title = tags.title;
      artist = tags.artist;
      album = tags.album;
      filePath = mp3Path;
    });
  }

  Future<void> _writeFileTags() async {
    if (filePath == null) return;

    // 创建要写入的新标签
    final newTags = AudioTags()
      ..title = 'New Title'
      ..artist = 'New Artist'
      ..album = 'New Album';

    // 使用audiotags插件写入标签
    await AudioTags.to(filePath!, newTags);

    // 重新读取标签以显示更改
    _readFileTags();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Audio Tags Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            children: [
              if (filePath != null)
                Text('File Path: $filePath'),
              if (title != null)
                Text('Title: $title'),
              if (artist != null)
                Text('Artist: $artist'),
              if (album != null)
                Text('Album: $album'),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _writeFileTags,
                child: Text('Update Tags'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

代码解释

  1. 依赖导入:导入flutter, audiotags, 和 path_provider包。
  2. 状态管理:使用StatefulWidget来管理UI状态。
  3. 读取标签:在initState方法中调用_readFileTags函数,该函数使用AudioTags.from方法读取音频文件的标签。
  4. 写入标签_writeFileTags函数创建一个新的AudioTags对象,并使用AudioTags.to方法将标签写入音频文件。
  5. UI显示:在UI中显示读取到的标签信息,并提供一个按钮来更新标签。

这个示例假设你有一个名为example.mp3的音频文件存储在应用的文档目录中。你可以根据需要修改文件路径。

请确保在实际使用中处理潜在的异常,例如文件不存在或读写权限问题。

回到顶部