Flutter插件fepe_record的介绍与使用
Flutter插件fepe_record的介绍与使用
概述
fepe_record
是一个用于从麦克风录制音频并保存到指定文件路径或流的插件。该插件在不同平台上依赖不同的底层技术来实现其功能:
- Android: 使用
AudioRecord
和MediaCodec
。 - 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
更多关于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. 检查录音状态
你可以通过 isRecording
和 isPaused
方法来检查当前的录音状态:
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"),
],
),
),
);
}
}