使用Agora SDK开发Android视频通话应用时无法获取原始视频帧问题求助
解决Agora SDK lib-raw-data无法捕获视频帧回调的问题
我仔细看了你的代码和问题描述,视频通话功能正常但onCaptureVideoFrame和onRenderVideoFrame始终没有触发回调,核心问题是你没有将MediaDataObserverPlugin和创建的RtcEngine实例绑定,这是使用lib-raw-data插件时很容易遗漏的关键步骤。下面是具体的修复方案和排查点:
1. 修复核心问题:绑定插件与RtcEngine
你的代码里只是初始化了MediaDataObserverPlugin,但没有让它和mRtcEngine建立关联,插件无法从引擎中拿到帧数据,自然不会触发回调。
你需要修改initializeEngine方法,在创建RtcEngine后立即绑定插件:
private void initializeEngine() { try { mRtcEngine = RtcEngine.create(getBaseContext(), getString(R.string.agora_app_id), mRtcHandler); // 新增:将插件与RtcEngine实例绑定 mediaDataObserverPlugin = MediaDataObserverPlugin.the(); mediaDataObserverPlugin.setRtcEngine(mRtcEngine); } catch (Exception e) { Log.e("Agora", Log.getStackTraceString(e)); throw new RuntimeException("Check rtc sdk init fatal error - " + Log.getStackTraceString(e)); } }
同时调整joinChannel方法的顺序,移除重复的插件初始化,确保先配置观察者再加入频道:
private void joinChannel() { String token = "<access token>"; if (TextUtils.isEmpty(token)) { token = null; } mRtcEngine.setChannelProfile(Constants.CHANNEL_PROFILE_COMMUNICATION); // 先设置观察者和预处理回调,再加入频道 mediaDataObserverPlugin.addVideoObserver(this); MediaPreProcessing.setCallback(mediaDataObserverPlugin); MediaPreProcessing.setVideoCaptureByteBuffer(mediaDataObserverPlugin.byteBufferCapture); mRtcEngine.joinChannel(token, "channel1", "", 0); }
2. 其他需要检查的细节
- 资源释放要彻底:在
onDestroy方法中添加插件的资源释放,避免内存泄漏:
@Override protected void onDestroy() { super.onDestroy(); if (!mCallEnd) { leaveChannel(); } // 新增:解除插件与RtcEngine的绑定 if (mediaDataObserverPlugin != null) { mediaDataObserverPlugin.setRtcEngine(null); } RtcEngine.destroy(); }
确保版本匹配:你的Agora SDK版本是3.3.1,要保证
lib-raw-data模块的版本和SDK完全一致,版本不兼容会导致插件无法正常工作。视频配置兼容性:你的视频编码配置(640x360、15fps)是标准格式,插件默认支持YUV420帧格式,这部分无需额外调整。
3. 验证修复效果
修改完成后重新运行应用,发起视频通话后查看Logcat,如果能看到onCaptureVideoFrame called和onRenderVideoFrame called的日志,说明回调已经正常触发了。
内容的提问来源于stack exchange,提问作者Dines G
相关产品推荐
相关产品推荐

