React-Native-WebRTC安卓5.0.2远程流无法工作问题求助
从你的代码和问题描述来看,Android 8.1正常但5.0.2远程流失效,大概率是旧Android版本对WebRTC API、媒体约束或编码格式的兼容性问题。下面是针对性的排查和修复方案:
1. 替换过时的媒体约束语法
Android 5.0的WebRTC实现对mandatory这种旧约束语法支持有限,尤其是minFrameRate这类属性可能导致SDP协商失败。建议改用标准的约束对象格式:
修改handleLogin里的getUserMedia参数:
mediaDevices.getUserMedia({ audio: true, video: { width: { ideal: 320 }, height: { ideal: 200 }, frameRate: { ideal: 30 }, facingMode: isFront ? "user" : "environment", deviceId: videoSourceId ? { exact: videoSourceId } : undefined } })
这里用ideal替代mandatory,同时简化了设备ID的指定方式,更符合WebRTC标准,也兼容旧版本。
2. 修正ICE服务器配置格式
旧版本的WebRTC可能要求ICE服务器用urls(复数)而不是url(单数),虽然部分实现兼容单数,但为了适配Android 5.0,建议修改:
var configuration = { "iceServers": [{ "urls": "stun:stun.l.google.com:19302" }] };
3. 切换到ontrack事件监听远程流
onaddstream是WebRTC的旧API,部分Android 5.0设备可能更适配现代的ontrack事件。替换你的远程流监听代码:
// 替换原来的yourConn.onaddstream yourConn.ontrack = (e) => { if (e.streams && e.streams[0]) { globalRemoteStreamState(e.streams[0]); } };
4. 强制使用兼容的视频编码格式
Android 5.0的硬件编解码器通常只支持H.264 Baseline profile,默认协商可能选择了不兼容的编码格式。在创建PeerConnection后添加编码约束:
yourConn = new RTCPeerConnection(configuration); yourConn.addStream(stream); // 添加编码偏好设置,优先选择H.264 Baseline yourConn.onnegotiationneeded = async () => { const senders = yourConn.getSenders(); for (const sender of senders) { if (sender.track.kind === 'video') { const params = sender.getParameters(); if (params.codecs) { // 过滤出H.264编码,并指定Baseline profile params.codecs = params.codecs.filter(codec => codec.mimeType === 'video/H264' && codec.sdpFmtpLine.includes('profile-level-id=42e01f') ); await sender.setParameters(params); } } } };
5. 检查react-native-webrtc版本兼容性
新版本的react-native-webrtc可能已经不再支持Android 5.0(API 21),如果上述修改无效,建议降级到支持API 21的版本,比如react-native-webrtc@100.0.0(具体版本可参考官方兼容性说明)。
6. 确认权限配置
确保AndroidManifest.xml中添加了所有必要权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
这些修改应该能解决Android 5.0.2上远程流无法加载的问题,建议逐一测试,先从媒体约束和ICE配置开始,因为这两个是旧版本兼容问题的高发点。
内容的提问来源于stack exchange,提问作者Muhammad

