Flutter Record包录音仅前1分钟有声后续无声问题求助
问题背景
使用Flutter的record包录制音频,录音过程无报错,但生成的.3gp文件仅前1分钟有声音,后续完全无声。录音代码如下:
Future<void> _startRecording() async { try { // Get the app-specific external storage directory for music final directory = await getExternalStorageDirectory(); if (directory == null) { debugPrint('Directory is null'); return; } // Create the directory if it doesn't exist final voiceDirectory = Directory('${directory.path}/VoiceNotes'); if (!voiceDirectory.existsSync()) { voiceDirectory.createSync(recursive: true); } // Generate the file path using the app-specific directory String filePath = '${voiceDirectory.path}/VoiceNote_${_generateTimestamp()}.3gp'; // Start recording using the generated file path await _audioRecorder.start( const RecordConfig(encoder: AudioEncoder.amrNb), path: filePath, ); } catch (e, stackTrace) { debugPrint('Error while recording: $e'); debugPrint('Stack trace: $stackTrace'); } }
已完成的排查
- 调试日志无异常输出
- 录音结束时已调用
stop()方法 - 麦克风和外部存储权限已确认授予
- 多设备测试问题复现
观察到的现象
- 录音全程无报错日志
- 生成文件前1分钟播放正常,后续无音频
- 使用
amrNb编码器,保存为.3gp格式
问题分析与解决方案
1. AMR-NB编码器的固有限制
AMR-NB(Adaptive Multi-Rate Narrowband)编码器的部分底层实现存在1分钟分段录制的限制,部分平台会自动将AMR-NB录音分割为1分钟的片段,而record包未处理片段合并逻辑,导致最终仅保留第一个片段。
2. 编码器与格式兼容性问题
.3gp容器搭配AMR-NB时,部分平台的音频写入逻辑存在缺陷,长时间录制时无法持续写入音频流,导致后续数据丢失。
解决办法
方案一:更换编码器与文件格式
改用支持长时间录制的编码器和格式,比如AudioEncoder.aacLc搭配.m4a格式,这是更通用且稳定的组合:
await _audioRecorder.start( const RecordConfig(encoder: AudioEncoder.aacLc), path: '${voiceDirectory.path}/VoiceNote_${_generateTimestamp()}.m4a', );
方案二:升级record包版本
部分旧版本的record包存在AMR-NB录制的bug,升级到最新稳定版可解决此类问题:
在pubspec.yaml中更新依赖:
dependencies: record: ^latest_version
执行flutter pub get完成升级。
方案三:添加录制状态监听,排查中断逻辑
在录制过程中添加状态监听,确认录音是否在1分钟后仍处于活跃状态,排查是否存在未捕获的中断逻辑:
_audioRecorder.onStateChanged().listen((state) { debugPrint('Recording state: $state'); });
如果监听显示1分钟后状态变为暂停或停止,需检查业务代码中是否有触发录音停止的隐藏逻辑。
方案四:原生录制验证(排除包的问题)
若以上方案无效,可尝试用原生Android/iOS代码实现简单的AMR-NB录制,验证是否是平台层面的限制。如果原生录制也出现同样问题,说明是设备/系统对AMR-NB的限制,必须更换编码器。
总结
最快速有效的解决方式是更换编码器为AAC-LC并使用.m4a格式,该组合在多平台上兼容性更好,无时长限制。若坚持使用AMR-NB,需确保record包为最新版本,并监听录制状态排查中断原因。
内容的提问来源于stack exchange,提问作者ussrback

