You need to enable JavaScript to run this app. WebRTC Android原生应用摄像头无法捕获媒体流问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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有效性
    1. 确认Android 6.0+已经动态申请了CAMERA权限,仅在AndroidManifest中声明权限不生效
    2. 移除assert localStream != null的判断(release包下assert不执行),改为显式非空校验,确认localStream是通过PeerConnectionFactory正确创建的实例,对应的videoSource、videoTrack均已完成初始化
  • 第五个注意点:避免核心对象被GC回收
    SurfaceTextureHelper不要作为startLocalVideoCapturing方法的局部变量,要提升为类成员变量持有引用,防止方法执行完后被系统回收,导致采集帧无法传递到视频源。

内容的提问来源于stack exchange,提问作者Nam V. Do

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 23:12:03