Flutter音频录制插件flutter_audio_recorder4的使用
Flutter音频录制插件flutter_audio_recorder4的使用
flutter_audio_recorder4
是一个支持录制、暂停、恢复和停止音频,并且提供音频级别表属性访问的插件。它基于 flutter_audio_recorder1/2/3
进行了改进。
主要原因
- 其他仓库没有跟上时代的步伐。
- 修复以下 Android 警告:
The plugin flutter_audio_recorder3 uses a deprecated version of the Android embedding.
- 修复在 Mac Sonoma 上的 Android Gradle 插件错误:
The Android Gradle plugin supports only Kotlin Gradle plugin version 1.5.20 and higher.
支持平台
该插件支持 Android
和 iOS
平台。
安装
在 pubspec.yaml
文件中添加 flutter_audio_recorder4
:
dependencies:
flutter_audio_recorder4: ^版本号
然后运行 flutter pub get
来安装依赖。
iOS权限
1. 添加描述到 Info.plist
<key>NSMicrophoneUsageDescription</key>
<string>Can We Use Your Microphone Please</string>
2. 使用 hasPermission
API 请求权限
bool hasPermission = await FlutterAudioRecorder4.hasPermissions;
Android权限
1. 在 AndroidManifest.xml
中添加权限
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2. 使用 hasPermission
API 请求权限
bool hasPermission = await FlutterAudioRecorder4.hasPermissions;
配置
iOS
确保 iOS 的部署目标为 8.0 或更高版本。
Android
- 使用最新版本的 AndroidX(
0.5.x
) - 使用旧版本的 Legacy Android(
0.4.9
)
使用方法
推荐的 API 使用顺序:hasPermission
=> init
=> start
-> (pause
<-> resume
) * n -> stop
。在开始新的录音之前,再次调用 init
。
检查权限
bool hasPermission = await FlutterAudioRecorder4.hasPermissions;
初始化
var recorder = FlutterAudioRecorder4("file_path.mp4"); // .wav .aac .m4a
await recorder.initialized;
或者指定音频格式:
var recorder = FlutterAudioRecorder4("file_path", audioFormat: AudioFormat.AAC); // 或者 AudioFormat.WAV
await recorder.initialized;
设置采样率:
var recorder = FlutterAudioRecorder4("file_path", audioFormat: AudioFormat.AAC, sampleRate: 22000); // 默认采样率为 16000
await recorder.initialized;
开始录音
await recorder.start();
var recording = await recorder.current(channel: 0);
获取录音详情
var current = await recording.current(channel: 0);
// 打印当前状态
// print(current.status);
// 使用定时器每 50ms 访问一次详情
new Timer.periodic(tick, (Timer t) async {
var current = await recording.current(channel: 0);
// 打印当前状态
// print(current.status);
setState(() {});
});
录音对象属性
名称 | 类型 |
---|---|
path | String |
extension | String |
duration | Duration |
audioFormat | AudioFormat |
metering | AudioMetering |
status | RecordingStatus |
录音对象计量属性
名称 | 类型 |
---|---|
peakPower | double |
averagePower | double |
isMeteringEnabled | bool |
录音状态
状态 |
---|
Unset |
Initialized |
Recording |
Paused |
Stopped |
暂停
await recorder.pause();
恢复
await recorder.resume();
停止
var result = await recorder.stop();
File file = widget.localFileSystem.file(result.path);
示例代码
以下是一个完整的示例代码:
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:flutter_audio_recorder4/flutter_audio_recorder4.dart';
import 'package:flutter_audio_recorder4_example/RecorderExample.dart';
import 'package:package_info_plus/package_info_plus.dart';
void main() {
// 确保在 runApp() 之前初始化
WidgetsFlutterBinding.ensureInitialized();
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []);
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
[@override](/user/override)
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String _appName = "Unknown";
String _packageName = "Unknown";
String _version = "Unknown";
String _buildNumber = "Unknown";
String _platformVersion = "Unknown";
final _flutterAudioRecorder4Plugin = FlutterAudioRecorder4(null);
[@override](/user/override)
void initState() {
super.initState();
initPlatformState();
}
// 异步初始化平台状态
Future<void> initPlatformState() async {
PackageInfo packageInfo = await PackageInfo.fromPlatform();
String platformVersion;
try {
platformVersion = await _flutterAudioRecorder4Plugin.getPlatformVersion() ?? 'Unknown platform version';
} on PlatformException {
platformVersion = 'Failed to get platform version.';
}
if (!mounted) return;
setState(() {
_appName = packageInfo.appName;
_packageName = packageInfo.packageName;
_version = packageInfo.version;
_buildNumber = packageInfo.buildNumber;
_platformVersion = platformVersion;
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Column(
children: [
Text(_appName),
Text(' $_version +$_buildNumber on $_platformVersion'),
],
)
),
body: const SafeArea(
child: RecorderExample()
)
),
);
}
}
更多关于Flutter音频录制插件flutter_audio_recorder4的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter音频录制插件flutter_audio_recorder4的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
flutter_audio_recorder4
是一个用于在 Flutter 应用中录制音频的插件。它提供了简单的 API 来开始、停止和暂停音频录制,并支持保存录制的音频文件。以下是使用 flutter_audio_recorder4
插件的基本步骤。
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 flutter_audio_recorder4
依赖:
dependencies:
flutter:
sdk: flutter
flutter_audio_recorder4: ^1.0.0 # 请检查最新版本
然后运行 flutter pub get
来安装依赖。
2. 配置权限
在 Android 和 iOS 上,你需要为应用配置音频录制权限。
Android
在 android/app/src/main/AndroidManifest.xml
文件中添加以下权限:
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
iOS
在 ios/Runner/Info.plist
文件中添加以下权限:
<key>NSMicrophoneUsageDescription</key>
<string>我们需要访问您的麦克风以录制音频。</string>
3. 初始化录音器
在你的 Dart 代码中,初始化 FlutterAudioRecorder4
。
import 'package:flutter_audio_recorder4/flutter_audio_recorder4.dart';
import 'package:permission_handler/permission_handler.dart';
class AudioRecorder {
FlutterAudioRecorder4? _recorder;
Future<void> init() async {
// 检查并请求录音权限
var status = await Permission.microphone.status;
if (!status.isGranted) {
await Permission.microphone.request();
}
// 初始化录音器
_recorder = FlutterAudioRecorder4('path/to/save/audio.mp4', audioFormat: AudioFormat.AAC);
await _recorder!.initialized;
}
}
4. 开始录音
使用 start()
方法开始录音。
Future<void> startRecording() async {
await _recorder!.start();
}
5. 暂停/恢复录音
你可以使用 pause()
和 resume()
方法来暂停和恢复录音。
Future<void> pauseRecording() async {
await _recorder!.pause();
}
Future<void> resumeRecording() async {
await _recorder!.resume();
}
6. 停止录音
使用 stop()
方法停止录音,并获取录制的音频文件。
Future<String> stopRecording() async {
var recording = await _recorder!.stop();
return recording.path; // 返回录音文件的路径
}
7. 完整示例
以下是一个简单的完整示例,展示了如何使用 flutter_audio_recorder4
来录制音频。
import 'package:flutter/material.dart';
import 'package:flutter_audio_recorder4/flutter_audio_recorder4.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: AudioRecorderPage(),
);
}
}
class AudioRecorderPage extends StatefulWidget {
[@override](/user/override)
_AudioRecorderPageState createState() => _AudioRecorderPageState();
}
class _AudioRecorderPageState extends State<AudioRecorderPage> {
FlutterAudioRecorder4? _recorder;
bool _isRecording = false;
String? _audioPath;
[@override](/user/override)
void initState() {
super.initState();
initRecorder();
}
Future<void> initRecorder() async {
var status = await Permission.microphone.status;
if (!status.isGranted) {
await Permission.microphone.request();
}
_recorder = FlutterAudioRecorder4('path/to/save/audio.mp4', audioFormat: AudioFormat.AAC);
await _recorder!.initialized;
}
Future<void> startRecording() async {
await _recorder!.start();
setState(() {
_isRecording = true;
});
}
Future<void> stopRecording() async {
var recording = await _recorder!.stop();
setState(() {
_isRecording = false;
_audioPath = recording.path;
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Audio Recorder'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
_isRecording
? Text('Recording...')
: Text('Press the button to start recording'),
SizedBox(height: 20),
_audioPath != null
? Text('Audio saved at: $_audioPath')
: Container(),
SizedBox(height: 20),
ElevatedButton(
onPressed: _isRecording ? stopRecording : startRecording,
child: Text(_isRecording ? 'Stop Recording' : 'Start Recording'),
),
],
),
),
);
}
}