如何在Flutter WebRTC中用setCodecPreferences设置PCMU及采样帧为640?
Flutter WebRTC 配置PCMU编码及自定义帧采样数
一、用setCodecPreferences指定PCMU编码
要强制使用PCMU音频编码,核心是从PeerConnection支持的编解码器列表中筛选出PCMU,再通过setCodecPreferences设置为首选:
- 先获取当前PeerConnection的音频发送器支持的编解码器列表
- 筛选出MIME类型为
audio/PCMU的编解码器(大小写不敏感) - 在创建SDP Offer/Answer之前,调用
setCodecPreferences传入筛选后的编解码器
示例代码:
// 假设pc是已初始化的RTCPeerConnection实例 final audioSender = pc.getSenders().firstWhere((sender) => sender.track?.kind == 'audio'); final rtpParams = await audioSender.getParameters(); // 筛选PCMU编解码器 final pcmuCodec = rtpParams.codecs.firstWhere( (codec) => codec.mimeType.toLowerCase() == 'audio/pcmu', orElse: () => throw StateError('当前环境不支持PCMU编码'), ); // 设置仅使用PCMU编码 await pc.setCodecPreferences([pcmuCodec]);
注意:必须在调用createOffer或createAnswer之前设置编解码器偏好,否则SDP不会包含指定的编码配置。
二、设置PCMU每帧采样数为640
PCMU默认基于8kHz采样率,每20ms生成一帧(对应160个采样点)。要得到640采样点的帧,需要将帧时长设置为80ms(8000Hz × 0.08s = 640),可以通过以下步骤实现:
- 在获取音频媒体流时,通过
MediaConstraints指定frameSize为80(单位:毫秒) - 配置RTCPeerConnection的音频发送参数,同步帧时长设置
示例代码:
// 构造音频约束,指定帧大小为80ms final audioConstraints = MediaConstraints( mandatory: { 'frameSize': '80', // 80ms对应640采样点 // 可选:关闭WebRTC默认的音频处理,避免干扰 'echoCancellation': 'false', 'googAutoGainControl': 'false', 'googNoiseSuppression': 'false', }, ); // 获取符合约束的音频流 final audioStream = await navigator.mediaDevices.getUserMedia({ 'audio': audioConstraints.toMap(), }); // 将音频轨道添加到PeerConnection final audioSender = await pc.addTrack(audioStream.getAudioTracks()[0], audioStream); // 配置RTP发送参数,确保帧时长生效 final rtpParams = await audioSender.getParameters(); for (final encoding in rtpParams.encodings) { encoding.maxPacketTime = 80; // 强制每80ms发送一个RTP包 } await audioSender.setParameters(rtpParams);
注意事项:
- 并非所有移动端平台都支持自定义音频帧大小,需要针对Android/iOS分别测试兼容性
- 摄像头端必须同步配置相同的帧时长(80ms/640采样点),否则会出现音频解码失败或不同步的问题
内容的提问来源于stack exchange,提问作者viki
相关产品推荐
相关产品推荐

