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
相关产品推荐
相关产品推荐

