Agora SDK 4.2.6通信频道中IVideoSource/IVideoFrameConsumer替代方案咨询
Agora SDK 4.2.6 通信频道中 IVideoSource/IVideoFrameConsumer 的替代方案
一、自定义视频输入(发送端,替代 IVideoSource + consumeByteArrayFrame)
在4.2.6版本的通信频道中,自定义视频源需使用ICustomVideoSource接口,配合VideoFrameSender完成字节数组帧的发送,替代原IVideoSource+consumeByteArrayFrame的逻辑:
- 实现
ICustomVideoSource接口,重写onInitialize、onStart、onStop、onDispose等生命周期方法 - 在
onInitialize方法中获取VideoFrameSender实例,用于后续帧发送 - 将字节数组格式的视频帧封装为
VideoFrame对象,需指定正确的像素格式、分辨率、时间戳等参数 - 调用
VideoFrameSender::sendVideoFrame方法发送封装后的帧,替代原consumeByteArrayFrame调用
示例代码片段:
#include <agora/media/base/media_base.h> #include <agora/rtc/rtc_engine.h> class CustomVideoSource : public agora::media::ICustomVideoSource { public: agora::media::IVideoFrameSender* frame_sender_ = nullptr; int onInitialize(agora::media::IVideoFrameSender* sender) override { frame_sender_ = sender; return 0; } void onStart() override { /* 启动自定义采集逻辑 */ } void onStop() override { /* 停止自定义采集逻辑 */ } void onDispose() override { frame_sender_ = nullptr; } // 发送字节数组格式的视频帧 void send_byte_array_frame(uint8_t* data, int width, int height) { if (!frame_sender_) return; agora::media::VideoFrame frame; frame.type = agora::media::VIDEO_FRAME_TYPE::VIDEO_FRAME_YUV420; frame.format = agora::media::VIDEO_PIXEL_FORMAT::VIDEO_PIXEL_I420; frame.width = width; frame.height = height; frame.yBuffer = data; frame.uBuffer = data + width * height; frame.vBuffer = data + width * height * 5 / 4; frame.timestamp = agora::commons::systemTimeInMilliseconds(); frame_sender_->sendVideoFrame(frame); } };
二、视频帧消费(接收端,替代 IVideoFrameConsumer)
若需处理本地或远端的视频帧,可通过注册IVideoFrameObserver接口实现,替代原IVideoFrameConsumer的consumeByteArrayFrame逻辑:
- 实现
IVideoFrameObserver接口,重写onCaptureVideoFrame(处理本地采集帧)或onRenderVideoFrame(处理远端接收帧)方法 - 在重写的方法中直接获取帧的字节数据,执行自定义处理逻辑
- 通过
IRtcEngine::registerVideoFrameObserver注册观察者,unregisterVideoFrameObserver取消注册
示例代码片段:
class VideoFrameConsumer : public agora::media::IVideoFrameObserver { public: bool onCaptureVideoFrame(agora::media::VIDEO_SOURCE_TYPE source_type, agora::media::VideoFrame& frame) override { // 获取字节数组数据(以YUV420为例) uint8_t* byte_data = frame.yBuffer; int total_size = frame.width * frame.height * 3 / 2; // 执行原consumeByteArrayFrame中的处理逻辑 // ... return true; // 返回true允许SDK继续处理帧,false则丢弃该帧 } bool onRenderVideoFrame(const char* channel_id, uid_t remote_uid, agora::media::VideoFrame& frame) override { // 处理远端视频帧的字节数据 uint8_t* byte_data = frame.yBuffer; // ... return true; } };
三、关键注意事项
- 初始化
IRtcEngine后,需通过enableVideo开启视频功能,再注册自定义视频源或帧观察者 - 字节数组帧的像素格式需与SDK支持的格式匹配(如YUV420、RGBA等),避免格式不兼容导致异常
- 发送帧时的时间戳需保持递增,建议使用系统单调时间,避免视频卡顿或时序混乱
内容的提问来源于stack exchange,提问作者Yash Patel
相关产品推荐
相关产品推荐

