Flutter桌面音频录制插件flutter_desktop_audio_recorder的使用
Flutter桌面音频录制插件flutter_desktop_audio_recorder的使用
输出文件类型
- macOS: .m4a
- Windows: .wav
使用方法
FlutterDesktopAudioRecorder recorder = FlutterDesktopAudioRecorder();
[@override](/user/override)
void initState() {
super.initState();
_hasMicPermission = await recorder.hasMicPermission();
recorder.permissionGrantedListener = () {
if (!mounted) return;
setState(() {
_hasMicPermission = true;
});
};
}
Future startRecording() async {
_fileName = DateTime.now().millisecondsSinceEpoch.toString();
String path = await Utilities.getVoiceFilePath();
try {
return await recorder.start(path: path, fileName: _fileName);
} on PlatformException catch (e) {
switch (e.code) {
case "permissionError":
recorder.requestMicPermission();
break;
default:
}
log(e.message ?? "Unhandled error");
}
}
Future stopRecording() async {
return recorder.stop();
}
Future isRecording() async {
return recorder.isRecording();
}
macOS权限设置
- 在
Info.plist
中添加麦克风使用描述:<key>NSMicrophoneUsageDescription</key> <string>可以使用您的麦克风吗?</string>
完整示例代码
import 'dart:developer';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:flutter_desktop_audio_recorder/flutter_desktop_audio_recorder.dart';
import 'package:flutter_desktop_audio_recorder_example/utilities.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
bool _hasMicPermission = false;
FlutterDesktopAudioRecorder recorder = FlutterDesktopAudioRecorder();
String _fileName = "";
[@override](/user/override)
void initState() {
super.initState();
initPlatformState();
recorder.permissionGrantedListener = () {
if (!mounted) return;
setState(() {
_hasMicPermission = true;
});
};
}
// 平台消息异步初始化
Future<void> initPlatformState() async {
_hasMicPermission = await recorder.hasMicPermission();
// 如果在异步平台消息处理期间小部件从树中移除,则丢弃回复而不是调用setState来更新我们的非存在的外观。
if (!mounted) return;
setState(() {});
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text("桌面音频录制示例"),
),
body: FutureBuilder<bool>(
future: recorder.isRecording(),
builder: (context, snapshot) {
bool? isRecording = snapshot.data;
return Center(
child: Column(
children: [
startRecordingButton(snapshot, isRecording),
const SizedBox(
height: 48,
),
Text((isRecording ?? false)
? "正在录制音频"
: _fileName.isEmpty
? ""
: "文件名: $_fileName.wav"),
Text(_hasMicPermission
? "权限已授予"
: "权限未授予")
],
),
);
}),
),
);
}
TextButton startRecordingButton(
AsyncSnapshot<bool> snapshot, bool? isRecording) {
return TextButton(
onPressed: () async {
if (snapshot.data != null) {
if (snapshot.data!) {
stopRecording().then((value) {
setState(() {});
});
setState(() {});
} else {
startRecording().then((value) {
recorder.isRecording().then((value) {
if (kDebugMode) {
print(value);
}
});
setState(() {});
});
setState(() {});
}
}
},
child: Text(isRecording == null
? "初始化中"
: !_hasMicPermission
? "请求麦克风权限"
: isRecording
? "停止"
: "开始录制"));
}
Future stopRecording() async {
return recorder.stop();
}
Future startRecording() async {
_fileName = DateTime.now().millisecondsSinceEpoch.toString();
String path = await Utilities.getVoiceFilePath();
try {
return await recorder.start(path: path, fileName: _fileName);
} on PlatformException catch (e) {
switch (e.code) {
case "permissionError":
recorder.requestMicPermission();
break;
default:
}
log(e.message ?? "未处理错误");
}
}
}
更多关于Flutter桌面音频录制插件flutter_desktop_audio_recorder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter桌面音频录制插件flutter_desktop_audio_recorder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter桌面应用中使用flutter_desktop_audio_recorder
插件进行音频录制的代码示例。请确保你已经按照插件的官方文档完成了相应的配置和安装。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加flutter_desktop_audio_recorder
依赖:
dependencies:
flutter:
sdk: flutter
flutter_desktop_audio_recorder: ^x.y.z # 替换为最新版本号
然后运行flutter pub get
来获取依赖。
2. 配置插件(仅桌面平台)
对于桌面平台(Windows、macOS、Linux),你需要在相应的配置文件中启用音频录制权限和设置。具体步骤请参考插件的官方文档。
3. 使用插件进行音频录制
以下是一个简单的Flutter应用示例,展示如何使用flutter_desktop_audio_recorder
进行音频录制并保存文件。
示例代码
import 'package:flutter/material.dart';
import 'package:flutter_desktop_audio_recorder/flutter_desktop_audio_recorder.dart';
import 'dart:io';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: AudioRecorderScreen(),
);
}
}
class AudioRecorderScreen extends StatefulWidget {
@override
_AudioRecorderScreenState createState() => _AudioRecorderScreenState();
}
class _AudioRecorderScreenState extends State<AudioRecorderScreen> {
late AudioRecorder _audioRecorder;
bool _isRecording = false;
String _recordingPath = '';
@override
void initState() {
super.initState();
_audioRecorder = AudioRecorder();
_audioRecorder.initialize().then((_) {
// Initialization complete
}).catchError((error) {
print("Error initializing audio recorder: $error");
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Audio Recorder'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
_isRecording ? 'Recording...' : 'Not Recording',
style: TextStyle(fontSize: 24),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _toggleRecording,
child: Text(_isRecording ? 'Stop Recording' : 'Start Recording'),
),
SizedBox(height: 20),
if (_recordingPath.isNotEmpty)
Text(
'Recording saved to: $_recordingPath',
style: TextStyle(fontSize: 18),
),
],
),
),
);
}
void _toggleRecording() {
setState(() {
if (_isRecording) {
_stopRecording();
} else {
_startRecording();
}
});
}
void _startRecording() async {
_isRecording = true;
String? path = await _audioRecorder.startRecording(
outputFilePath: '${Directory.systemTemp.path}/audio_recording.wav',
audioFormat: AudioFormat.wav,
sampleRate: 44100,
numChannels: 2,
bitDepth: 16,
);
if (path != null) {
_recordingPath = path;
} else {
_isRecording = false; // Failed to start recording
print("Failed to start recording");
}
}
void _stopRecording() async {
bool success = await _audioRecorder.stopRecording();
_isRecording = !success; // If stop fails, continue recording
if (success) {
print("Recording stopped successfully");
} else {
print("Failed to stop recording");
}
}
}
说明
- 初始化插件:在
initState
方法中初始化AudioRecorder
实例。 - 录制控制:通过
_toggleRecording
方法切换录制状态。如果当前在录制,则停止录制;否则开始录制。 - 开始录制:
_startRecording
方法启动音频录制,并指定输出文件路径、音频格式、采样率、声道数和位深度。 - 停止录制:
_stopRecording
方法停止音频录制。
注意事项
- 确保你的桌面环境具有音频录制权限。
- 根据需要调整音频参数(如采样率、声道数、位深度等)。
- 处理音频文件时,请确保路径和文件名是有效的,并且应用具有写入权限。
以上代码提供了一个基本的音频录制功能示例,你可以根据需要进行扩展和修改。