Flutter插件fepe_record的介绍与使用

Flutter插件fepe_record的介绍与使用

概述

fepe_record 是一个用于从麦克风录制音频并保存到指定文件路径或流的插件。该插件在不同平台上依赖不同的底层技术来实现其功能:

  • Android: 使用 AudioRecordMediaCodec
  • iOS 和 macOS: 使用 AVFoundation
  • Windows: 使用 MediaFoundation
  • Web: 使用浏览器及其底层平台。
  • Linux: 编码由 fmedia 提供(必须单独安装)。

功能矩阵

以下为各平台支持的功能列表:

平台特性对比矩阵

特性 Android iOS Web Windows macOS Linux
暂停/恢复 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
振幅(dBFS) ✔️ ✔️ ✔️ ✔️ ✔️
权限检查 ✔️ ✔️ ✔️ ✔️
声道数量 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
设备选择 ✔️* 自动 ✔️ ✔️ ✔️ ✔️
自动增益 ✔️ (始终激活?) ✔️
回声消除 ✔️ ✔️
噪声抑制 ✔️ ✔️

* 注:问号 (?) 表示当前浏览器(Chrome/Firefox)未支持,但插件本身支持这些格式。

文件编码支持

编码器 Android iOS Web Windows macOS Linux
aacLc ✔️ ✔️ ? ✔️ ✔️ ✔️
aacEld ✔️ ✔️ ? ✔️
aacHe ✔️ ? ✔️
amrNb ✔️ ? ✔️
amrWb ✔️ ?
opus ✔️ ✔️ ✔️
wav ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
flac ✔️ ✔️ ? ✔️ ✔️ ✔️
pcm16bits ✔️ ✔️ ✔️ ✔️ ✔️

流式编码支持

编码器 Android iOS Web Windows macOS Linux
aacLc ✔️
aacEld ✔️
aacHe ✔️
pcm16bits ✔️ ✔️ ✔️ ✔️ ✔️

* AAC 流式传输时带有 ADTS 头部,因此可以直接通过文件读取!

注意: 所有音频输出均为 16 位深度。


使用方法

以下是一个完整的示例代码,展示如何使用 fepe_record 插件进行录音。

import 'package:flutter/material.dart';
import 'package:fepe_record/record.dart'; // 引入 fepe_record 插件

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: const MyHomePage(title: '录音示例'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final AudioRecorder record = AudioRecorder(); // 初始化录音对象
  String recordingPath = ''; // 录音文件路径

  Future<void> startRecording() async {
    // 检查权限
    if (await record.hasPermission()) {
      // 开始录音并保存到文件
      recordingPath = await record.start(
        const RecordConfig(),
        path: 'myFile.m4a', // 替换为你想要保存的路径
      );

      print('录音开始,文件路径: $recordingPath');
    } else {
      print('录音权限被拒绝');
    }
  }

  Future<void> stopRecording() async {
    // 停止录音
    final path = await record.stop();
    print('录音停止,文件路径: $path');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(widget.title)),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: startRecording,
              child: const Text('开始录音'),
            ),
            ElevatedButton(
              onPressed: stopRecording,
              child: const Text('停止录音'),
            ),
          ],
        ),
      ),
    );
  }

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

设置权限及其他配置

Android 配置

AndroidManifest.xml 中添加以下权限:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 可选:如果需要使用蓝牙设备(最低 SDK 23) -->
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<!-- 可选:如果需要将录音保存到公共目录 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

注意:

  • 最低 SDK 版本为 21(对于 AMR 编码最低为 26,Opus 编码最低为 29)。
  • 音频格式的采样率参考 官方文档

iOS 配置

Info.plist 文件中添加以下内容:

<key>NSMicrophoneUsageDescription</key>
<string>我们需要访问您的麦克风以进行录音。</string>

注意: 最低 SDK 版本为 11.0。

macOS 配置

同样在 Info.plist 文件中添加以下内容:

<key>NSMicrophoneUsageDescription</key>
<string>我们需要访问您的麦克风以进行录音。</string>

此外,还需要在项目设置中启用 “Audio input” 功能:

  • 在调试和发布方案中激活 “Audio input”。
  • 或者直接在 *.entitlements 文件中添加以下内容:
<key>com.apple.security.device.audio-input</key>
<true/>

更多关于Flutter插件fepe_record的介绍与使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件fepe_record的介绍与使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


fepe_record 是一个用于在 Flutter 应用中录制音频的插件。它提供了简单易用的 API,允许开发者在应用中实现音频录制功能。以下是对 fepe_record 插件的介绍与使用说明。

1. 安装插件

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

dependencies:
  flutter:
    sdk: flutter
  fepe_record: ^0.0.1  # 请根据实际情况填写最新版本号

然后运行 flutter pub get 来安装插件。

2. 导入插件

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

import 'package:fepe_record/fepe_record.dart';

3. 初始化录音器

在使用 fepe_record 之前,你需要初始化录音器:

FepeRecord fepeRecord = FepeRecord();

4. 开始录音

你可以使用 start 方法来开始录音:

await fepeRecord.start();

5. 停止录音

使用 stop 方法来停止录音,并返回录音文件的路径:

String? filePath = await fepeRecord.stop();
if (filePath != null) {
  print("录音文件路径: $filePath");
}

6. 暂停和恢复录音

fepe_record 还支持暂停和恢复录音:

// 暂停录音
await fepeRecord.pause();

// 恢复录音
await fepeRecord.resume();

7. 检查录音状态

你可以通过 isRecordingisPaused 方法来检查当前的录音状态:

bool isRecording = await fepeRecord.isRecording();
bool isPaused = await fepeRecord.isPaused();

8. 设置录音参数

你可以在开始录音之前设置一些录音参数,例如采样率、比特率等:

await fepeRecord.setParameters(
  sampleRate: 44100,
  bitRate: 128000,
  // 其他参数
);

9. 处理权限

在 Android 和 iOS 上,录音功能需要获取麦克风权限。你可以使用 permission_handler 插件来处理权限请求:

import 'package:permission_handler/permission_handler.dart';

Future<void> requestMicrophonePermission() async {
  var status = await Permission.microphone.status;
  if (!status.isGranted) {
    await Permission.microphone.request();
  }
}

10. 示例代码

以下是一个完整的示例代码,展示了如何使用 fepe_record 插件进行录音:

import 'package:flutter/material.dart';
import 'package:fepe_record/fepe_record.dart';
import 'package:permission_handler/permission_handler.dart';

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

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

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

class _AudioRecorderScreenState extends State<AudioRecorderScreen> {
  FepeRecord fepeRecord = FepeRecord();
  String? filePath;

  Future<void> startRecording() async {
    await requestMicrophonePermission();
    await fepeRecord.start();
  }

  Future<void> stopRecording() async {
    filePath = await fepeRecord.stop();
    setState(() {});
  }

  Future<void> requestMicrophonePermission() async {
    var status = await Permission.microphone.status;
    if (!status.isGranted) {
      await Permission.microphone.request();
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Audio Recorder'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: startRecording,
              child: Text('Start Recording'),
            ),
            ElevatedButton(
              onPressed: stopRecording,
              child: Text('Stop Recording'),
            ),
            if (filePath != null) Text("录音文件路径: $filePath"),
          ],
        ),
      ),
    );
  }
}
回到顶部