You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:42:39