Flutter应用如何实现时长超过一分钟的音频录制?
如何在Flutter应用中实现时长超过一分钟的音频录制
要实现无时长限制(支持超过一分钟)的音频录制,推荐使用成熟的第三方音频库,比如flutter_sound或record,这两个库都没有默认的录制时长限制,下面以flutter_sound为例给出完整实现方案:
1. 添加依赖
在项目的pubspec.yaml中加入依赖:
dependencies: flutter_sound: ^9.2.13 # 可替换为最新版本 permission_handler: ^10.2.0 # 用于申请权限
执行flutter pub get安装依赖。
2. 配置系统权限
Android端
在android/app/src/main/AndroidManifest.xml中添加权限声明:
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 可选,用于保存录制文件到本地 -->
iOS端
在ios/Runner/Info.plist中添加麦克风权限说明:
<key>NSMicrophoneUsageDescription</key> <string>需要访问麦克风进行音频录制</string>
3. 实现录制逻辑
封装一个音频录制工具类:
import 'package:flutter_sound/flutter_sound.dart'; import 'package:permission_handler/permission_handler.dart'; class AudioRecorder { FlutterSoundRecorder? _recorder; String? _recordedFilePath; // 初始化录制器 Future<void> init() async { _recorder = FlutterSoundRecorder(); // 申请麦克风权限 final micPermission = await Permission.microphone.request(); if (micPermission != PermissionStatus.granted) { throw Exception('未获取麦克风权限,无法录制音频'); } await _recorder!.openRecorder(); } // 开始录制 Future<void> start() async { // 用时间戳作为文件名,避免重复 _recordedFilePath = '${DateTime.now().millisecondsSinceEpoch}.aac'; await _recorder!.startRecorder( toFile: _recordedFilePath, codec: Codec.aacADTS, // 选择合适的编码格式 ); } // 停止录制,返回文件路径 Future<String?> stop() async { await _recorder!.stopRecorder(); return _recordedFilePath; } // 释放资源 void dispose() { _recorder?.closeRecorder(); _recorder = null; } }
4. 在页面中使用录制功能
import 'package:flutter/material.dart'; class LongRecordingPage extends StatefulWidget { const LongRecordingPage({super.key}); @override State<LongRecordingPage> createState() => _LongRecordingPageState(); } class _LongRecordingPageState extends State<LongRecordingPage> { final AudioRecorder _audioRecorder = AudioRecorder(); bool _isRecording = false; @override void initState() { super.initState(); _audioRecorder.init(); } @override void dispose() { _audioRecorder.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('长时间音频录制')), body: Center( child: ElevatedButton( onPressed: () async { if (_isRecording) { final filePath = await _audioRecorder.stop(); setState(() => _isRecording = false); print('录制完成,文件路径:$filePath'); // 这里可以添加文件上传、播放等后续逻辑 } else { await _audioRecorder.start(); setState(() => _isRecording = true); } }, child: Text(_isRecording ? '停止录制' : '开始录制'), ), ), ); } }
注意事项
- 录制格式可根据需求调整,
flutter_sound支持aacADTS、mp3、wav等多种编码格式 - 长时间录制需注意设备存储空间,建议在录制前检查剩余空间
- 如果选择
record库,实现逻辑类似,核心都是申请权限后调用start/stop方法,同样支持无限制时长录制
内容的提问来源于stack exchange,提问作者Hossam Aboud
相关产品推荐
相关产品推荐

