Flutter音频录制插件record的使用
Flutter音频录制插件record的使用
插件简介
record
是一个用于从麦克风录制音频到给定文件路径或流的Flutter插件。它在不同平台上依赖不同的技术实现:
- Android: 使用
AudioRecord
和MediaCodec
或MediaRecorder
- iOS 和 macOS: 使用
AVFoundation
- Windows: 使用
MediaFoundation
- Web: 依赖浏览器及其底层平台
- Linux: 编码由 fmedia 提供,必须单独安装
平台特性对等矩阵
Feature | Android | iOS | web | Windows | macOS | linux |
---|---|---|---|---|---|---|
pause/resume | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
amplitude(dBFS) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | |
permission check | ✔️ | ✔️ | ✔️ | ✔️ | ||
num of channels | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
device selection | ✔️ 1/2 | 自动 | ✔️ | ✔️ | ✔️ | ✔️ |
auto gain | ✔️ 2 | 总是开启? | ✔️ | |||
echo cancel | ✔️ 2 | ✔️ | ||||
noise suppression | ✔️ 2 | ✔️ |
文件编码支持
Encoder | Android | iOS | web | Windows | macOS | linux |
---|---|---|---|---|---|---|
aacLc | ✔️ | ✔️ | ? | ✔️ | ✔️ | ✔️ |
aacEld | ✔️ | ✔️ | ? | ✔️ | ||
aacHe | ✔️ | ? | ✔️ | |||
amrNb | ✔️ | ? | ✔️ | |||
amrWb | ✔️ | ? | ||||
opus | ✔️ | ? | ✔️ | |||
wav | ✔️ 2 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
flac | ✔️ 2 | ✔️ | ? | ✔️ | ✔️ | ✔️ |
pcm16bits | ✔️ 2 | ✔️ | ✔️ | ✔️ | ✔️ |
流编码支持
Encoder | Android | iOS | web | Windows | macOS | linux |
---|---|---|---|---|---|---|
aacLc * | ✔️ 2 | |||||
aacEld * | ✔️ 2 | |||||
aacHe * | ✔️ 2 | |||||
pcm16bits | ✔️ 2 | ✔️ | ✔️ | ✔️ | ✔️ |
- AAC is streamed with raw AAC with ADTS headers, so it’s directly readable through a file!
使用示例
import 'package:record/record.dart';
final record = AudioRecorder();
// 检查并请求权限(如果需要)
if (await record.hasPermission()) {
// 开始录音到文件
await record.start(const RecordConfig(), path: 'aFullPath/myFile.m4a');
// ... 或者开始录音到流
final stream = await record.startStream(const RecordConfig(encoder: AudioEncoder.pcm16bits));
}
// 停止录音...
final path = await record.stop();
// ... 或者取消录音(并隐式删除文件/blob)
await record.cancel();
record.dispose(); // 不要忘记这一步
设置权限和其他配置
Android
根据需要跟随Gradle设置。
添加以下权限到 AndroidManifest.xml
:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 可选:如果你想要使用蓝牙电话设备如耳机/耳塞 -->
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<!-- 可选:如果你想要将录音保存到公共文件夹 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 最低SDK版本:23 (amrNb/amrWb: 26, Opus: 29)
iOS
在 Info.plist
中添加以下内容:
<key>NSMicrophoneUsageDescription</key>
<string>描述为什么你需要这个权限</string>
- 最低SDK版本:11.0
macOS
在 Info.plist
中添加以下内容:
<key>NSMicrophoneUsageDescription</key>
<string>描述为什么你需要这个权限</string>
或者直接在 *.entitlements
文件中:
<key>com.apple.security.device.audio-input</key>
<true/>
- 最低SDK版本:10.15
Web
Web平台使用 package web >=0.5.1
,这是从 Flutter >=3.22 版本开始提供的。
完整示例代码
下面是一个完整的示例代码,展示了如何使用 record
插件进行录音和播放:
import 'package:flutter/material.dart';
import 'package:record/record.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> {
bool showPlayer = false;
String? audioPath;
final Record _audioRecorder = Record();
@override
void initState() {
super.initState();
initPlatformState();
}
Future<void> initPlatformState() async {
if (!await _audioRecorder.hasPermission()) {
await _audioRecorder.requestPermission();
}
}
Future<void> startRecording() async {
try {
final directory = await getApplicationDocumentsDirectory();
final path = '${directory.path}/test.m4a';
if (await _audioRecorder.isPaused()) {
await _audioRecorder.resume();
} else {
await _audioRecorder.start(
path: path,
encoder: AudioEncoder.aacLc,
bitRate: 128000,
samplingRate: 44100,
);
}
setState(() {
audioPath = path;
});
} catch (e) {
print('Error starting recording: $e');
}
}
Future<void> stopRecording() async {
final path = await _audioRecorder.stop();
setState(() {
audioPath = path;
showPlayer = true;
});
}
Future<void> cancelRecording() async {
await _audioRecorder.cancel();
setState(() {
audioPath = null;
showPlayer = false;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Audio Recorder Example'),
),
body: Center(
child: showPlayer
? Padding(
padding: const EdgeInsets.symmetric(horizontal: 25),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Recorded file path: $audioPath'),
ElevatedButton(
onPressed: () async {
await stopRecording();
},
child: const Text('Stop Recording'),
),
ElevatedButton(
onPressed: () async {
await cancelRecording();
},
child: const Text('Cancel Recording'),
),
],
),
)
: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () async {
await startRecording();
},
child: const Text('Start Recording'),
),
ElevatedButton(
onPressed: () async {
await stopRecording();
},
child: const Text('Stop Recording'),
),
],
),
),
),
);
}
}
这个示例展示了如何使用 record
插件进行录音、停止录音以及取消录音,并在界面上显示相应的按钮和状态。希望这些信息能帮助你更好地理解和使用 record
插件!
更多关于Flutter音频录制插件record的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter音频录制插件record的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个使用Flutter音频录制插件record
的示例代码。这个插件允许你在Flutter应用中录制音频。首先,你需要在你的pubspec.yaml
文件中添加依赖项:
dependencies:
flutter:
sdk: flutter
record: ^2.0.0 # 请确保使用最新版本
然后运行flutter pub get
来获取依赖项。
接下来,在你的Flutter项目中创建一个新的Dart文件,例如audio_recorder.dart
,并编写以下代码:
import 'package:flutter/material.dart';
import 'package:record/record.dart';
import 'dart:io';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: AudioRecorderPage(),
);
}
}
class AudioRecorderPage extends StatefulWidget {
@override
_AudioRecorderPageState createState() => _AudioRecorderPageState();
}
class _AudioRecorderPageState extends State<AudioRecorderPage> {
late Recorder recorder;
String? recordedFilePath;
bool isRecording = false;
@override
void initState() {
super.initState();
// 初始化Recorder实例
recorder = Recorder();
recorder.initialize().then((_) {
// 初始化成功后设置状态
setState(() {});
}).catchError((e) {
print("初始化Recorder时出错: $e");
});
}
@override
void dispose() {
// 释放Recorder资源
recorder.dispose();
super.dispose();
}
void startRecording() async {
if (!isRecording) {
setState(() {
isRecording = true;
});
// 开始录制音频
File? audioFile = await recorder.start(path: "${(await getApplicationDocumentsDirectory()).path}/audio_record.wav");
if (audioFile != null) {
setState(() {
recordedFilePath = audioFile.path;
});
}
// 停止录制(这里为了演示,录制5秒后停止)
Future.delayed(Duration(seconds: 5), () {
stopRecording();
});
}
}
void stopRecording() async {
if (isRecording) {
setState(() {
isRecording = false;
});
// 停止录制音频
await recorder.stop();
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("音频录制示例"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: startRecording,
child: Text(isRecording ? "停止录制" : "开始录制"),
),
if (recordedFilePath != null)
Text("录制文件路径: $recordedFilePath"),
],
),
),
);
}
}
这个示例展示了如何使用record
插件进行基本的音频录制功能。以下是一些关键点:
- 初始化Recorder实例:在
initState
方法中初始化Recorder
实例,并处理初始化成功或失败的情况。 - 开始录制音频:通过调用
recorder.start
方法开始录制音频,并保存音频文件路径。 - 停止录制音频:通过调用
recorder.stop
方法停止录制音频。 - 释放资源:在
dispose
方法中释放Recorder
实例资源,以防止内存泄漏。
请注意,这个示例中录制5秒后自动停止录制,实际应用中你可能需要根据具体需求调整这部分逻辑。此外,请确保你的应用有适当的权限来访问存储和录制音频。