Flutter音频录制插件next_audio_recorder的使用
Flutter音频录制插件next_audio_recorder的使用
简介
next_audio_recorder
是一个用于在Flutter应用程序中录制音频的插件,它提供了设置订阅持续时间等额外功能。
功能特性
- 在Flutter应用中录制音频。
- 设置录音的订阅持续时间。
开始使用
要使用此插件,首先需要在 pubspec.yaml
文件中添加 next_audio_recorder
作为依赖项。
dependencies:
next_audio_recorder: ^最新版本号
权限设置
在开始录音之前,确保为Android项目添加音频权限,并使用 PermissionHandler
包请求权限。
1. 修改 AndroidManifest.xml
文件,添加以下权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2. 使用 PermissionHandler
请求音频权限:
import 'package:permission_handler/permission_handler.dart';
Future<bool> _requestPermission() async {
var status = await Permission.microphone.request();
if (status != PermissionStatus.granted) {
return false;
}
return true;
}
示例代码
以下是一个完整的示例代码,展示了如何使用 next_audio_recorder
插件进行音频录制和停止录音。
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:next_audio_recorder/next_audio_recorder.dart';
import 'package:permission_handler/permission_handler.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Next Audio Recorder',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final _nextAudioRecorder = NextAudioRecorder();
// 控制音频订阅的刷新时间
final double _subscriptionDuration = 100;
// 开始录音
startRecording() async {
bool recordPermission = await _requestPermission();
if (recordPermission) {
await _nextAudioRecorder.startRecorder('output.mp4'); // 开始录音并指定输出文件名
await _nextAudioRecorder.setSubscriptionDuration(_subscriptionDuration); // 设置订阅持续时间
_nextAudioRecorder.startRecorderSubscriptions((e) async {
// 可以在此处触发函数或监听特定任务,例如检测用户停止说话
});
} else {
if (kDebugMode) {
print('需要音频权限。');
}
}
}
// 停止录音
stopRecorder() async {
if (kDebugMode) {
print('[StartRecordEvent] 停止录音');
}
_nextAudioRecorder.cancelRecorderSubscriptions(); // 取消订阅
String? outputFilePath = await _nextAudioRecorder.stopRecorder(); // 停止录音并获取输出文件路径
if (outputFilePath != null) {
if (kDebugMode) {
print('[StartRecordEvent] 输出录音文件路径: $outputFilePath');
}
} else {
if (kDebugMode) {
print('[StartRecordEvent] 未找到输出文件路径。');
}
}
}
// 请求音频权限
Future<bool> _requestPermission() async {
var status = await Permission.microphone.request();
if (status != PermissionStatus.granted) {
return false;
}
return true;
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Next Audio Recorder'),
),
body: Center(
child: Column(children: [
const SizedBox(height: 50),
FilledButton(
onPressed: startRecording,
child: const Text('开始录音'),
),
FilledButton(
onPressed: stopRecorder,
child: const Text('停止录音'),
),
const Spacer(),
const Text('Zeroboy'),
const SizedBox(height: 50),
]),
),
);
}
}
自动停止录音
next_audio_recorder
还支持在检测到用户停止说话后自动停止录音。可以通过 startRecorderWithAutoStop
方法实现:
await _audioRecorder.startRecorderWithAutoStop(
silentDecibelThreshold: 42, // 设置静音阈值(分贝)
silentDurationSecond: 2, // 设置静音持续时间(秒)
targetFilePath: 'output.mp4', // 指定输出文件路径
onFinished: (outputFilePath) {
// 录音完成后的回调
},
);
更多关于Flutter音频录制插件next_audio_recorder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter音频录制插件next_audio_recorder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用next_audio_recorder
插件进行音频录制的示例代码。这个插件允许你以相对简单的方式在Flutter应用中实现音频录制功能。
首先,确保你已经在pubspec.yaml
文件中添加了next_audio_recorder
依赖:
dependencies:
flutter:
sdk: flutter
next_audio_recorder: ^latest_version # 请替换为最新的版本号
然后,运行flutter pub get
来安装依赖。
接下来,在你的Flutter项目中创建一个页面,用于实现音频录制功能。以下是一个简单的示例代码:
import 'package:flutter/material.dart';
import 'package:next_audio_recorder/next_audio_recorder.dart';
import 'package:path_provider/path_provider.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Audio Recorder Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: AudioRecorderPage(),
);
}
}
class AudioRecorderPage extends StatefulWidget {
@override
_AudioRecorderPageState createState() => _AudioRecorderPageState();
}
class _AudioRecorderPageState extends State<AudioRecorderPage> {
late NextAudioRecorder _recorder;
late String _recordingPath;
bool _isRecording = false;
@override
void initState() {
super.initState();
_initRecorder();
}
Future<void> _initRecorder() async {
final Directory appDocDir = await getApplicationDocumentsDirectory();
String appDocPath = appDocDir.path;
_recordingPath = '$appDocPath/audio_${DateTime.now().millisecondsSinceEpoch}.wav';
_recorder = NextAudioRecorder(
audioFormat: AudioFormat.wav,
codec: AudioCodec.aac,
channel: AudioChannel.stereo,
sampleRate: 44100,
bitRate: 128000,
);
_recorder.recorderHandler = (event, map) {
if (event == RecorderEvent.recorderStart) {
setState(() {
_isRecording = true;
});
} else if (event == RecorderEvent.recorderStop ||
event == RecorderEvent.recorderCancel ||
event == RecorderEvent.recorderError) {
setState(() {
_isRecording = false;
});
}
};
}
Future<void> _startRecording() async {
if (!_isRecording) {
try {
await _recorder.start(_recordingPath);
} catch (e) {
print('Start recording failed: $e');
}
}
}
Future<void> _stopRecording() async {
if (_isRecording) {
try {
await _recorder.stop();
} catch (e) {
print('Stop recording failed: $e');
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Audio Recorder Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: _isRecording ? null : _startRecording,
child: Text(_isRecording ? 'Recording...' : 'Start Recording'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _isRecording ? _stopRecording : null,
child: Text(_isRecording ? 'Stop Recording' : 'Stop (Disabled)'),
),
],
),
),
);
}
@override
void dispose() {
_recorder.dispose();
super.dispose();
}
}
解释
- 依赖管理:在
pubspec.yaml
中添加next_audio_recorder
依赖。 - 页面布局:创建一个简单的Flutter页面,包含两个按钮用于开始和停止录音。
- 初始化录音器:在
initState
方法中初始化NextAudioRecorder
实例,并设置录音文件的保存路径。 - 录音控制:提供
_startRecording
和_stopRecording
方法用于控制录音的开始和停止。 - UI更新:根据录音状态更新按钮的文本和可用性。
- 资源释放:在
dispose
方法中释放录音器资源。
这个示例展示了如何使用next_audio_recorder
插件进行基本的音频录制功能。你可以根据需要进一步扩展和自定义功能。