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

Flutter安卓APP中如何捕获麦克风音频并转为Blob通过WebSocket传输?

解决方案

你当前代码里的RTCVideoRenderer是用于视频渲染的,音频流不需要这个,可以直接移除。要实现实时捕获麦克风音频并转成可通过WebSocket发送的二进制数据(对应Blob),推荐使用flutter_sound插件,它能更方便地监听实时音频数据回调,具体步骤如下:

1. 添加依赖

在pubspec.yaml中添加以下依赖:

dependencies:
  flutter_sound: ^9.2.13
  permission_handler: ^10.2.0
  web_socket_channel: ^2.4.0

2. 配置Android权限

在android/app/src/main/AndroidManifest.xml中添加必要权限:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />

3. 实现实时音频捕获与WebSocket传输

以下是完整的核心代码示例:

import 'package:flutter_sound/flutter_sound.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:web_socket_channel/web_socket_channel.dart';

class AudioStreamManager {
  final FlutterSoundRecorder _recorder = FlutterSoundRecorder();
  WebSocketChannel? _webSocketChannel;

  // 初始化录音与WebSocket连接
  Future<void> initAudioStream(String wsServerUrl) async {
    // 申请麦克风权限
    final micStatus = await Permission.microphone.request();
    if (micStatus.isDenied) {
      throw Exception("麦克风权限被拒绝,无法录制音频");
    }

    // 初始化录音器,设置回调间隔(100ms一次,平衡实时性与网络压力)
    await _recorder.openRecorder();
    await _recorder.setSubscriptionDuration(const Duration(milliseconds: 100));

    // 建立WebSocket连接
    _webSocketChannel = WebSocketChannel.connect(Uri.parse(wsServerUrl));
  }

  // 开始实时录制并发送音频数据
  Future<void> startStreaming() async {
    await _recorder.startRecorder(
      toFile: null, // 不保存到本地,仅获取实时数据流
      codec: Codec.aacADTS, // 用AAC压缩格式,减少传输数据量
      audioSource: AudioSource.microphone,
    );

    // 监听音频数据回调,实时发送到服务器
    _recorder.onProgress.listen((disposition) {
      if (disposition.soundBytes != null && _webSocketChannel != null) {
        // Dart的Uint8List对应前端的Blob二进制数据,直接通过WebSocket发送
        _webSocketChannel!.sink.add(disposition.soundBytes!);
      }
    });
  }

  // 停止录制并关闭连接
  Future<void> stopStreaming() async {
    await _recorder.stopRecorder();
    await _recorder.closeRecorder();
    _webSocketChannel?.sink.close();
  }
}

关键说明

  • 音频格式选择:示例用aacADTS压缩格式,若服务器需要原始PCM数据,可替换为Codec.pcm16,但PCM数据量较大,建议优先用压缩格式。
  • 回调间隔调整:setSubscriptionDuration的时间越短,实时性越高,但会增加网络请求频率,可根据业务需求在100-200ms区间调整。
  • Blob对应关系:Dart中的Uint8List就是二进制字节数组,发送到服务器后可直接解析为Blob类型处理。

如果坚持使用flutter_webrtc,可以通过MediaRecorder将流录制到内存文件再读取,但跨平台兼容性和易用性不如flutter_sound,不推荐。

内容的提问来源于stack exchange,提问作者jiaoxiaker abby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 05:42:21