WebRTC Android原生应用摄像头无法捕获媒体流问题求助
WebRTC Android推流无法获取媒体流解决思路
- 核心问题定位
从运行日志可以确认,摄像头本身采集工作正常(CameraStatistics输出帧率稳定30fps),大量丢帧报错是因为本地渲染器未完成初始化,另外代码存在逻辑错误导致采集配置未生效。 - 第一个修复点:补全SurfaceViewRenderer初始化逻辑
你代码中的localSurfaceRenderer仅配置了显示属性,未执行初始化操作,需在调用addSink前,传入共用的Egl上下文完成初始化:
// 先将EglBase从局部变量改为类成员变量,避免被GC回收,且保证上下文全局统一 private EglBase rootEglBase = EglBase.create(); // 初始化渲染器 localSurfaceRenderer.init(rootEglBase.getEglBaseContext(), null); // 再执行后续的setMirror、addSink等操作
- 第二个修复点:修正VideoCapturer返回逻辑
你在createCapturer方法中创建了WebRtcCapturer包装类并配置了采集格式,却返回了原始未配置的CameraVideoCapturer实例,配置完全未生效,需要修改返回值:
// 原代码错误写法 // return capturer; // 修正为返回包装后的实例 return fancyWebRTCCapturer;
- 第三个修复点:统一采集分辨率配置
不要在startCapture中硬编码1280*720 30fps参数,优先使用你在createCapturer中选中的设备支持的采集格式参数,避免不兼容导致的采集失败:
// 从capturer中获取已配置的format参数调用startCapture localVideoCapturer.startCapture(selectedFormat.width, selectedFormat.height, selectedFormat.framerate);
- 第四个排查点:确认权限与localStream有效性
- 确认Android 6.0+已经动态申请了
CAMERA权限,仅在AndroidManifest中声明权限不生效 - 移除
assert localStream != null的判断(release包下assert不执行),改为显式非空校验,确认localStream是通过PeerConnectionFactory正确创建的实例,对应的videoSource、videoTrack均已完成初始化
- 确认Android 6.0+已经动态申请了
- 第五个注意点:避免核心对象被GC回收
SurfaceTextureHelper不要作为startLocalVideoCapturing方法的局部变量,要提升为类成员变量持有引用,防止方法执行完后被系统回收,导致采集帧无法传递到视频源。
内容的提问来源于stack exchange,提问作者Nam V. Do
相关产品推荐
相关产品推荐

