You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Record包录音仅前1分钟有声后续无声问题求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 10:08:12