Flutter音频文件读取插件audiofilereader的使用

Flutter音频文件读取插件audiofilereader的使用

audiofilereader 是一个用于音频播放的 Flutter 插件。它支持多种功能,包括从项目资产、本地文件、字节数组和远程 URL 中读取音频数据,同时提供了许多实用的功能如跳转到特定位置、回调通知、循环播放、音量控制等。

支持的功能

  • 从 Flutter 项目资产、本地文件、字节数组和远程 URL 加载音频数据。
  • 支持跳转到指定位置。
  • 提供加载音频时长、当前播放位置和播放完成的回调。
  • 支持循环播放。
  • 支持音量调节。
  • 支持暂停/恢复播放。
  • 支持多个音频播放器,并具有内存管理功能。
  • 支持后台音频播放。
  • 设置操作系统显示的媒体操作和元数据。
  • 自定义 Android 通知栏按钮。

开始使用

1. 添加依赖

pubspec.yaml 文件中添加 audiofilereader 作为依赖项:

dependencies:
  audiofilereader: ^版本号

然后运行以下命令以更新依赖项:

flutter pub get

示例代码

以下是使用 audiofilereader 的完整示例代码,展示如何实现不同场景下的音频播放。

import 'dart:io' show Directory, Platform;
import 'dart:typed_data';
import 'dart:ui' as ui;

import 'package:audiofilereader/audiofileplayer.dart';
import 'package:audiofilereader/audio_system.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'package:path_provider/path_provider.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: AudioPlayerExample(),
    );
  }
}

class AudioPlayerExample extends StatefulWidget {
  @override
  _AudioPlayerExampleState createState() => _AudioPlayerExampleState();
}

class _AudioPlayerExampleState extends State<AudioPlayerExample> {
  Audio _audio;

  @override
  void initState() {
    super.initState();
    // 加载音频文件
    _audio = Audio.load('assets/audio/sample.mp3');
  }

  @override
  void dispose() {
    // 释放资源
    _audio.dispose();
    super.dispose();
  }

  void _playAudio() {
    _audio.play();
  }

  void _pauseAudio() {
    _audio.pause();
  }

  void _resumeAudio() {
    _audio.resume();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Audio Player Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _playAudio,
              child: Text('播放音频'),
            ),
            ElevatedButton(
              onPressed: _pauseAudio,
              child: Text('暂停音频'),
            ),
            ElevatedButton(
              onPressed: _resumeAudio,
              child: Text('继续播放'),
            ),
          ],
        ),
      ),
    );
  }
}

使用说明

1. 从资产加载音频

Audio audio = Audio.load('assets/audio/sample.mp3');
audio.play(); // 播放音频
audio.pause(); // 暂停音频
audio.dispose(); // 释放资源

2. 使用回调获取信息

Audio audio = Audio.load('assets/audio/sample.mp3',
    onComplete: () => print('音频播放完成!'),
    onDuration: (double durationSeconds) => print('音频时长为 $durationSeconds 秒'),
    onPosition: (double positionSeconds) => print('当前播放位置为 $positionSeconds 秒'));

3. 后台音频播放

iOS 配置

Info.plist 文件中添加以下配置:

<key>UIBackgroundModes</key>
<array>
    <string>audio</string>
</array>

Android 配置

AndroidManifest.xml 中添加以下权限和服务:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<service
    android:name="com.google.flutter.plugins.audiofileplayer.AudiofileplayerService"
    android:foregroundServiceType="mediaPlayback">
    <intent-filter>
        <action android:name="android.media.browse.MediaBrowserService" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</service>
<receiver android:name="androidx.media.session.MediaButtonReceiver">
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>

在代码中启用后台播放:

Audio backgroundAudio = Audio.load('assets/audio/sample.mp3', playInBackground: true);

注意事项

  1. iOS 远程音频加载
    如果加载非 HTTPS 的远程音频 URL,需要在 Info.plist 中添加以下配置:

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
    
  2. Android 小图标
    如果通知栏图标显示为白色方块,需要在 AndroidManifest.xml 中指定透明背景的小图标:

    <meta-data android:name="ic_audiofilereader" android:value="drawable/notification_icon" />
    

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

1 回复

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


audiofilereader 是一个用于读取音频文件并提取其原始 PCM 数据的 Flutter 插件。它可以帮助你从音频文件中获取原始音频数据,以便进行进一步的处理或分析。以下是使用 audiofilereader 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 audiofilereader 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  audiofilereader: ^0.0.1  # 请检查最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的 Dart 文件中导入 audiofilereader 插件:

import 'package:audiofilereader/audiofilereader.dart';

3. 读取音频文件

使用 AudioFileReader 类来读取音频文件。以下是一个简单的示例,展示如何读取音频文件并获取其 PCM 数据:

import 'package:flutter/material.dart';
import 'package:audiofilereader/audiofilereader.dart';
import 'package:flutter/services.dart' show rootBundle;

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: AudioReaderExample(),
    );
  }
}

class AudioReaderExample extends StatefulWidget {
  [@override](/user/override)
  _AudioReaderExampleState createState() => _AudioReaderExampleState();
}

class _AudioReaderExampleState extends State<AudioReaderExample> {
  List<int>? pcmData;

  Future<void> readAudioFile() async {
    try {
      // 加载音频文件
      ByteData data = await rootBundle.load('assets/audio.wav');
      Uint8List bytes = data.buffer.asUint8List();

      // 读取音频文件
      AudioFileReader reader = AudioFileReader();
      pcmData = await reader.readAudioFile(bytes);

      setState(() {});
    } catch (e) {
      print("Error reading audio file: $e");
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Audio File Reader Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: readAudioFile,
              child: Text('Read Audio File'),
            ),
            if (pcmData != null)
              Text('PCM Data Length: ${pcmData!.length}'),
          ],
        ),
      ),
    );
  }
}
回到顶部