欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

网易互动直播2.0 开发 三 互动事件回调信息

程序员文章站 2022-07-06 20:28:06
...

 

一 SDK回调信息

初始化参数时,有这么一项

    IRtcEngineEventHandlerEx *event_handler;    /**< 用于 SDK 向 App 发送回调事件通知。*/

网易互动直播2.0 开发 三 互动事件回调信息

SDK向APP发送的事件通知,由此处理

1.1 基本回调信息

我们比较关注,SDK有哪些信息可以回调给我们,以下是最基本的回调信息

namespace nertc
{
/** IRtcEngineEventHandler 回调接口类用于 SDK 向 App 发送回调事件通知,App 通过继承该接口类的方法获取 SDK 的事件通知。

 接口类的所有方法都有缺省(空)实现,App 可以根据需要只继承关心的事件。在回调方法中,App 不应该做耗时或者调用可能会引起阻塞的 API(如开启音频或视频等),否则可能影响 SDK 的运行。
 */
class IRtcEngineEventHandler
{
public:
    virtual ~IRtcEngineEventHandler() {}

    /** 发生错误回调。

     该回调方法表示 SDK 运行时出现了(网络或媒体相关的)错误。通常情况下,SDK上报的错误意味着SDK无法自动恢复,需要 App 干预或提示用户。

     @param error_code 错误代码: #NERtcDMErrorCode.
     @param msg 错误描述。
     */
    virtual void onError(int error_code, const char* msg) {
        (void)error_code;
        (void)msg;
    }

    /** 发生警告回调。

     该回调方法表示 SDK 运行时出现了(网络或媒体相关的)警告。通常情况下,SDK 上报的警告信息 App 可以忽略,SDK 会自动恢复。

     @param warn_code 错误代码: #NERtcWarnCode.
     @param msg 警告描述。
     */
    virtual void onWarning(int warn_code, const char* msg) {
        (void)warn_code;
        (void)msg;
    }

    /** 释放硬件资源的回调。

     SDK提示释放硬件资源是否成功。

     @param result 返回结果。
     */
    virtual void onReleasedHwResources(NERtcErrorCode result) {
        (void)result;
    }

    /** 加入频道回调。

     @param cid  频道 ID。
     @param uid  用户 ID。
     @param result  返回结果。
     @param elapsed 从 joinChannel 开始到发生此事件过去的时间(毫秒)。
     */
    virtual void onJoinChannel(channel_id_t cid, uid_t uid, NERtcErrorCode result, uint64_t elapsed) {
        (void)cid;
        (void)uid;
        (void)result;
        (void)elapsed;
    }

    /** 触发重连。

      有时候由于网络原因,客户端可能会和服务器失去连接,SDK会进行自动重连,开始自动重连后触发此回调。

     @param cid  频道 ID。
     @param uid  用户 ID。
     */
    virtual void onReconnectingStart(channel_id_t cid, uid_t uid) {
        (void)cid;
        (void)uid;
    }

    /** 重新加入频道回调。

	  有时候由于网络原因,客户端可能会和服务器失去连接,SDK会进行自动重连,自动重连后触发此回调方法。

     @param cid  频道 ID。
     @param uid  用户 ID。
     @param result  返回结果。
     @param elapsed 从开始重连到发生此事件过去的时间(毫秒)。
     */
    virtual void onRejoinChannel(channel_id_t cid, uid_t uid, NERtcErrorCode result, uint64_t elapsed) {
        (void)cid;
        (void)uid;
        (void)result;
    }

    /** 离开频道回调。

     App 调用 \ref IRtcEngine::leaveChannel "leaveChannel" 方法时,SDK提示 App 离开频道是否成功。

     @param result 返回结果。
     */
    virtual void onLeaveChannel(NERtcErrorCode result) {
        (void)result;
    }

    /** 掉线回调。

	  由于非网络原因,客户端可能会和服务器失去连接,此时SDK无需自动重连,直接触发此回调方法。

     @param reason  返回结果。
     */
    virtual void onDisconnect(NERtcErrorCode reason) {
        (void)reason;
    }

    /** 远端用户加入当前频道回调。

     - 通信模式下,该回调提示有远端用户加入了频道,并返回新加入用户的 ID;如果加入之前,已经有其他用户在频道中了,新加入的用户也会收到这些已有用户加入频道的回调。

     @param uid 新加入频道的远端用户ID。
     @param user_name 新加入频道的远端用户名。
     */
    virtual void onUserJoined(uid_t uid, const char * user_name) {
        (void)uid;
        (void)user_name;
    }

    /** 远端用户离开当前频道回调。

     提示有远端用户离开了频道(或掉线)。

     @param uid 远端用户ID。
     @param reason 远端用户离开原因。
     */
    virtual void onUserLeft(uid_t uid, NERtcSessionLeaveReason reason) {
        (void)uid;
        (void)reason;
    }
    /** 远端用户开启音频回调。
    
     @param uid 远端用户ID。
     */
    virtual void onUserAudioStart(uid_t uid) {
        (void)uid;
    }
    /** 远端用户停用音频回调。

     @param uid 远端用户ID。
     */
    virtual void onUserAudioStop(uid_t uid) {
        (void)uid;
    }
    /** 远端用户开启视频回调。

     @param uid 远端用户ID。
     @param max_profile 最大分辨率。
     */
    virtual void onUserVideoStart(uid_t uid, NERtcVideoProfileType max_profile) {
        (void)uid;
        (void)max_profile;
    }
    /** 远端用户停用视频回调。

     @param uid 远端用户ID。
     */
    virtual void onUserVideoStop(uid_t uid) {
        (void)uid;
    }
};
} //namespace nertc

其中几个重要的回调如下:

1)加入频道回调


    /** 加入频道回调。

     @param cid  频道 ID。
     @param uid  用户 ID。
     @param result  返回结果。
     @param elapsed 从 joinChannel 开始到发生此事件过去的时间(毫秒)。
     */
    virtual void onJoinChannel(channel_id_t cid, uid_t uid, NERtcErrorCode result, uint64_t elapsed) {
        (void)cid;
        (void)uid;
        (void)result;
        (void)elapsed;
    }

2)离开频道回调

    /** 离开频道回调。

     App 调用 \ref IRtcEngine::leaveChannel "leaveChannel" 方法时,SDK提示 App 离开频道是否成功。

     @param result 返回结果。
     */
    virtual void onLeaveChannel(NERtcErrorCode result) {
        (void)result;
    }

3)远端用户加入当前频道回调

    /** 远端用户加入当前频道回调。

     - 通信模式下,该回调提示有远端用户加入了频道,并返回新加入用户的 ID;如果加入之前,已经有其他用户在频道中了,新加入的用户也会收到这些已有用户加入频道的回调。

     @param uid 新加入频道的远端用户ID。
     @param user_name 新加入频道的远端用户名。
     */
    virtual void onUserJoined(uid_t uid, const char * user_name) {
        (void)uid;
        (void)user_name;
    }

4)远端用户离开当前频道回调

    /** 远端用户离开当前频道回调。

     提示有远端用户离开了频道(或掉线)。

     @param uid 远端用户ID。
     @param reason 远端用户离开原因。
     */
    virtual void onUserLeft(uid_t uid, NERtcSessionLeaveReason reason) {
        (void)uid;
        (void)reason;
    }

 

1.2 扩展回调信息

 

namespace nertc
{
/** IRtcEngineEventHandlerEx 回调扩展接口类用于 SDK 向 App 发送回调事件通知,App 通过继承该接口类的方法获取 SDK 的事件通知。

 接口类的所有方法都有缺省(空)实现,App 可以根据需要只继承关心的事件。在回调方法中,App 不应该做耗时或者调用可能会引起阻塞的 API(如开启音频或视频等),否则可能影响 SDK 的运行。
 */
class IRtcEngineEventHandlerEx : public IRtcEngineEventHandler
{
public:
    virtual ~IRtcEngineEventHandlerEx() {}
    /** 远端用户视频配置更新回调。

     @param uid 远端用户ID。
     @param max_profile 最大分辨率。
     */
    virtual void onUserVideoProfileUpdate(uid_t uid, NERtcVideoProfileType max_profile) {
        (void)uid;
        (void)max_profile;
    }
    /** 远端用户是否静音回调。

     @param uid 远端用户ID。
     @param mute 是否静音。
     */
    virtual void onUserAudioMute(uid_t uid, bool mute) {
        (void)uid;
        (void)mute;
    }
    /** 远端用户是否禁视频流回调。

     @param uid 远端用户ID。
     @param mute 是否禁视频流。
     */
    virtual void onUserVideoMute(uid_t uid, bool mute) {
        (void)uid;
        (void)mute;
    }

    /** 音频设备状态更改回调。

     @param device_id 设备ID。
     @param device_type 音频设备类型。
     @param device_state 音频设备状态。
     */
    virtual void onAudioDeviceStateChanged(const char device_id[kNERtcMaxDeviceIDLength],
        NERtcAudioDeviceType device_type,
        NERtcAudioDeviceState device_state) {
        (void)device_id;
        (void)device_type;
        (void)device_state;
    }

    /** 音频默认设备更改回调。

     @param device_id 设备ID。
     @param device_type 音频设备类型。
     */
    virtual void onAudioDefaultDeviceChanged(const char device_id[kNERtcMaxDeviceIDLength],
        NERtcAudioDeviceType device_type) {
        (void)device_id;
        (void)device_type;
    }

    /** 视频设备状态更改回调。

     @param device_id 设备ID。
     @param device_type 视频设备类型。
     @param device_state 视频设备状态。
     */
    virtual void onVideoDeviceStateChanged(const char device_id[kNERtcMaxDeviceIDLength],
        NERtcVideoDeviceType device_type,
        NERtcVideoDeviceState device_state) {
        (void)device_id;
        (void)device_type;
        (void)device_state;
    }

    /** 已接收到远端音频首帧回调。

     @param uid 发送音频帧的远端用户的用户 ID。
     */
    virtual void onFirstAudioDataReceived(uid_t uid) {
        (void)uid;
    }

    /** 已显示首帧远端视频回调。

    第一帧远端视频显示在视图上时,触发此调用。

     @param uid 用户 ID,指定是哪个用户的视频流。
     */
    virtual void onFirstVideoDataReceived(uid_t uid) {
        (void)uid;
    } 

    /** 已解码远端音频首帧的回调。

     @param uid 远端用户 ID。
     */
    virtual void onFirstAudioFrameDecoded(uid_t uid) {
        (void)uid;
    }

    /** 已接收到远端视频并完成解码回调。

    引擎收到第一帧远端视频流并解码成功时,触发此调用。 App 可在此回调中设置该用户的 video canvas。

     @param uid 用户 ID,指定是哪个用户的视频流。
     @param width 视频流宽(px)。
     @param height 视频流高(px)。

     */
    virtual void onFirstVideoFrameDecoded(uid_t uid, uint32_t width, uint32_t height) {
        (void)uid;
        (void)width;
        (void)height;
    } 

    /** 采集视频数据回调。

     @param data 采集视频数据。
     @param type 视频类型。
     @param width 视频宽度。
     @param height 视频高度。
     @param count 视频Plane Count。
     @param offset 视频offset。
     @param stride 视频stride。
     @param rotation 视频旋转角度。
     */
    virtual void onCaptureVideoFrame(void *data,
        NERtcVideoType type, 
        uint32_t width, 
        uint32_t height,
        uint32_t count,
        uint32_t offset[kNERtcMaxPlaneCount],
        uint32_t stride[kNERtcMaxPlaneCount],
        NERtcVideoRotation rotation) {
        (void)data;
        (void)type;
        (void)width;
        (void)height;
        (void)count;
        (void)offset;
        (void)stride;
        (void)rotation;
    }

    /** 本地用户的音乐文件播放状态改变回调。

    调用 startAudioMixing 播放混音音乐文件后,当音乐文件的播放状态发生改变时,会触发该回调。

    - 如果播放音乐文件正常结束,state 会返回相应的状态码 kNERtcAudioMixingStateFinished,error_code 返回 kNERtcAudioMixingErrorOK。
    - 如果播放出错,则返回状态码 kNERtcAudioMixingStateFailed,error_code 返回相应的出错原因。
    - 如果本地音乐文件不存在、文件格式不支持、无法访问在线音乐文件 URL,error_code都会返回 kNERtcAudioMixingErrorCanNotOpen。

    @param state 音乐文件播放状态,详见 #NERtcAudioMixingState.
    @param error_code 错误码,详见 #NERtcAudioMixingErrorCode.
    */
    virtual void onAudioMixingStateChanged(NERtcAudioMixingState state, NERtcAudioMixingErrorCode error_code) {
        (void)state;
        (void)error_code;
    }

    /** 本地用户的音乐文件播放进度回调。

    调用 startAudioMixing 播放混音音乐文件后,当音乐文件的播放进度改变时,会触发该回调。
    @param timestamp_ms 音乐文件播放进度,单位为毫秒
    */
    virtual void onAudioMixingTimestampUpdate(uint64_t timestamp_ms) {
        (void)timestamp_ms;
    }

    /** 本地音效文件播放已结束回调。

    当播放音效结束后,会触发该回调。
    @param effect_id 指定音效的 ID。每个音效均有唯一的 ID。
    */
    virtual void onAudioEffectFinished(uint32_t effect_id) {
        (void)effect_id;
    }

    /** 提示频道内本地用户瞬时音量的回调。

     该回调默认禁用。可以通过 enableAudioVolumeIndication 方法开启;
     开启后,本地用户说话,SDK 会按 enableAudioVolumeIndication 方法中设置的时间间隔触发该回调。
     如果本地用户将自己静音(调用了 muteLocalAudioStream),SDK 将音量设置为 0 后回调给应用层。

     @param volume (混音后的)音量,取值范围为 [0,100]。
     */
    virtual void onLocalAudioVolumeIndication(int volume) {
        (void)volume;
    }

    /** 提示频道内谁正在说话及说话者瞬时音量的回调。

     该回调默认禁用。可以通过 enableAudioVolumeIndication 方法开启;
     开启后,无论频道内是否有人说话,SDK 都会按 enableAudioVolumeIndication 方法中设置的时间间隔触发该回调。

     在返回的 speakers 数组中:

     - 如果有 uid 出现在上次返回的数组中,但不在本次返回的数组中,则默认该 uid 对应的远端用户没有说话。
     - 如果volume 为 0,表示该用户没有说话。
     - 如果speakers 数组为空,则表示此时远端没有人说话。

     @param speakers 每个说话者的用户 ID 和音量信息的数组: NERtcAudioVolumeInfo
     @param speaker_number speakers 数组的大小,即说话者的人数。
     @param total_volume (混音后的)总音量,取值范围为 [0,100]。
     */
    virtual void onRemoteAudioVolumeIndication(const NERtcAudioVolumeInfo *speakers, unsigned int speaker_number, int total_volume) {
        (void)speakers;
        (void)speaker_number;
        (void)total_volume;
    }

    /** 通知添加直播任务结果。

     该回调异步返回 \ref IRtcEngineEx::addLiveStreamTask "addLiveStreamTask" 接口的调用结果;实际推流状态参考 \ref IRtcEngineEventHandlerEx::onLiveStreamState "onLiveStreamState"

     @param task_id 任务id
     @param url 推流地址
     @param error_code 结果
     - 0: 调用成功;
     - 其他: 调用失败。
     */
    virtual void onAddLiveStreamTask(const char* task_id, const char* url, int error_code) {
        (void)task_id;
        (void)url;
        (void)error_code;
    }

    /** 通知更新直播任务结果。

     该回调异步返回 \ref IRtcEngineEx::updateLiveStreamTask "updateLiveStreamTask" 接口的调用结果;实际推流状态参考 \ref IRtcEngineEventHandlerEx::onLiveStreamState "onLiveStreamState"

     @param task_id 任务id
     @param url 推流地址
     @param error_code 结果
     - 0: 调用成功;
     - 其他: 调用失败。
     */
    virtual void onUpdateLiveStreamTask(const char* task_id, const char* url, int error_code) {
        (void)task_id;
        (void)url;
        (void)error_code;
    }

    /** 通知删除直播任务结果。

     该回调异步返回 \ref IRtcEngineEx::removeLiveStreamTask "removeLiveStreamTask" 接口的调用结果;实际推流状态参考 \ref IRtcEngineEventHandlerEx::onLiveStreamState "onLiveStreamState"

     @param task_id 任务id
     @param error_code 结果
     - 0: 调用成功;
     - 其他: 调用失败。
     */
    virtual void onRemoveLiveStreamTask(const char* task_id, int error_code) {
        (void)task_id;
        (void)error_code;
    }

    /** 通知直播推流状态

     @param task_id 任务id
     @param url 推流地址
     @param state #NERtcLiveStreamStateCode, 直播推流状态
     - 505: 推流中;
     - 506: 推流失败;
     - 511: 推流结束;
     */
    virtual void onLiveStreamState(const char* task_id, const char* url, NERtcLiveStreamStateCode state) {
        (void)task_id;
        (void)url;
        (void)state;
    }
};
} //namespace nertc

 其中,重要的有:

1)已接收到远端视频并完成解码回调

    /** 已接收到远端视频并完成解码回调。

    引擎收到第一帧远端视频流并解码成功时,触发此调用。 App 可在此回调中设置该用户的 video canvas。

     @param uid 用户 ID,指定是哪个用户的视频流。
     @param width 视频流宽(px)。
     @param height 视频流高(px)。

     */
    virtual void onFirstVideoFrameDecoded(uid_t uid, uint32_t width, uint32_t height) {
        (void)uid;
        (void)width;
        (void)height;
    } 

 

2)采集视频数据回调

    /** 采集视频数据回调。

     @param data 采集视频数据。
     @param type 视频类型。
     @param width 视频宽度。
     @param height 视频高度。
     @param count 视频Plane Count。
     @param offset 视频offset。
     @param stride 视频stride。
     @param rotation 视频旋转角度。
     */
    virtual void onCaptureVideoFrame(void *data,
        NERtcVideoType type, 
        uint32_t width, 
        uint32_t height,
        uint32_t count,
        uint32_t offset[kNERtcMaxPlaneCount],
        uint32_t stride[kNERtcMaxPlaneCount],
        NERtcVideoRotation rotation) {
        (void)data;
        (void)type;
        (void)width;
        (void)height;
        (void)count;
        (void)offset;
        (void)stride;
        (void)rotation;
    }

 

3)提示频道内本地用户瞬时音量的回调


    /** 提示频道内本地用户瞬时音量的回调。

     该回调默认禁用。可以通过 enableAudioVolumeIndication 方法开启;
     开启后,本地用户说话,SDK 会按 enableAudioVolumeIndication 方法中设置的时间间隔触发该回调。
     如果本地用户将自己静音(调用了 muteLocalAudioStream),SDK 将音量设置为 0 后回调给应用层。

     @param volume (混音后的)音量,取值范围为 [0,100]。
     */
    virtual void onLocalAudioVolumeIndication(int volume) {
        (void)volume;
    }

4)提示频道内谁正在说话及说话者瞬时音量的回调

   /** 提示频道内谁正在说话及说话者瞬时音量的回调。

     该回调默认禁用。可以通过 enableAudioVolumeIndication 方法开启;
     开启后,无论频道内是否有人说话,SDK 都会按 enableAudioVolumeIndication 方法中设置的时间间隔触发该回调。

     在返回的 speakers 数组中:

     - 如果有 uid 出现在上次返回的数组中,但不在本次返回的数组中,则默认该 uid 对应的远端用户没有说话。
     - 如果volume 为 0,表示该用户没有说话。
     - 如果speakers 数组为空,则表示此时远端没有人说话。

     @param speakers 每个说话者的用户 ID 和音量信息的数组: NERtcAudioVolumeInfo
     @param speaker_number speakers 数组的大小,即说话者的人数。
     @param total_volume (混音后的)总音量,取值范围为 [0,100]。
     */
    virtual void onRemoteAudioVolumeIndication(const NERtcAudioVolumeInfo *speakers, unsigned int speaker_number, int total_volume) {
        (void)speakers;
        (void)speaker_number;
        (void)total_volume;
    }

5)通知直播推流状态

    /** 通知直播推流状态

     @param task_id 任务id
     @param url 推流地址
     @param state #NERtcLiveStreamStateCode, 直播推流状态
     - 505: 推流中;
     - 506: 推流失败;
     - 511: 推流结束;
     */
    virtual void onLiveStreamState(const char* task_id, const char* url, NERtcLiveStreamStateCode state) {
        (void)task_id;
        (void)url;
        (void)state;
    }

 

1.3 使用方式

1.3.1 自定义派生类,重写自己在意的回调事件

using namespace nertc;
class NRTCEngineEvent : public IRtcEngineEventHandlerEx
{
    NRTCEngine& m_engine;
public:
    NRTCEngineEvent(NRTCEngine & engine)
        :m_engine(engine)
    {}


    virtual void onUserVideoStop(nertc::uid_t uid) override{
        emit m_engine.videoStopped(uid);
        m_engine.stopRemoteVideo(uid);
    }

    virtual void onUserVideoStart(nertc::uid_t uid, NERtcVideoProfileType max_profile) override {
        emit m_engine.videoStart(uid, (int) max_profile);
        m_engine.startRemoteVideo(uid);
    }

    virtual void onUserAudioStop(nertc::uid_t uid) override {
        m_engine.stopRemoteAudio(uid);
    }

    virtual void onUserAudioStart(nertc::uid_t uid) override {
        m_engine.startRemoteAudio(uid);
    }

    virtual void onJoinChannel(channel_id_t cid, nertc::uid_t uid, NERtcErrorCode result, uint64_t elapsed) override{
        if (!result){
            emit m_engine.joinedChannelSuccess();

        }else{
            qDebug("[INFO] uid %d joining channel %d unsuccessfully, ERROR CODE: %d", uid, cid, result);
        }
    }

    virtual void onUserJoined(nertc::uid_t uid, const char * user_name) override{
        qDebug("[INFO] Remote user %lld joined channel successuflly.", uid);
        emit m_engine.userJoined((quint64)uid);
    }

    virtual void onUserLeft(nertc::uid_t uid, NERtcSessionLeaveReason reason) override{
        qDebug("[INFO] Remote user %lld left channel.", uid);
        emit m_engine.userLeft((quint64)uid);
    }

};

 

1.3.2 初始化时,设置回调事件处理器

    std::unique_ptr<nertc::IRtcEngineEventHandlerEx> rtc_engine_handler_;

//初始化智能指针
    NRTCEngine::NRTCEngine(QObject *parent) : QObject(parent) ,
      rtc_engine_handler_(new NRTCEngineEvent(*this))

//引擎初始化时,在引擎初始化参数中设置事件回调处理器

    rtc_engine_ = static_cast<IRtcEngineEx *>(createNERtcEngine());
    rtc_engine_context_.app_key = app_key;
    rtc_engine_context_.log_dir_path = log_dir_path;
    rtc_engine_context_.log_level = kNERtcLogLevelInfo;
    rtc_engine_context_.log_file_max_size_KBytes = log_file_max_size_KBytes;
    rtc_engine_context_.event_handler = rtc_engine_handler_.get(); //设置事件回调处理器
    rtc_engine_context_.video_use_exnternal_render = false;

    //Init NERTC engine
    if (kNERtcNoError != rtc_engine_->initialize(rtc_engine_context_)){
        qDebug("ERROR: Failed to initialize NERtc Engine\n");
        return false;
    }

 

 

 

 

二  统计信息回调

除了SDK直接回调的事件外,我们还可以通过设置统计观察者方法,获得SDK相关的统计信息

2.1 注册统计信息观测器

 

   网易互动直播2.0 开发 三 互动事件回调信息

 

    /** 注册统计信息观测器。

    @param[in] observer 统计信息观测器

    @return
    - 0: 方法调用成功;
    - 其他: 方法调用失败。
    */
    virtual int setStatsObserver(IRtcMediaStatsObserver *observer) = 0;

 

2.2 有哪些回调的统计信息

 

namespace nertc
{
/** IRtcMediaStatsObserver 回调扩展接口类用于 SDK 向 App 上报统计信息。

 接口类的所有方法都有缺省(空)实现,App 可以根据需要只继承关心的事件。在回调方法中,App 不应该做耗时或者调用可能会引起阻塞的 API(如开启音频或视频等),否则可能影响 SDK 的运行。
 */
class IRtcMediaStatsObserver
{
public:
    virtual ~IRtcMediaStatsObserver() {}

    /** 当前通话统计回调。

    SDK 定期向 App 报告当前通话的统计信息,每 2 秒触发一次。

     @param stats NERTC 引擎统计数据: NERtcStats
     */
    virtual void onRtcStats(const NERtcStats &stats) {
        (void)stats;
    }    

    /** 本地音频流统计信息回调。

    该回调描述本地设备发送音频流的统计信息,每 2 秒触发一次。

     @param stats 本地音频流统计信息。详见 NERtcAudioSendStats.
     */
    virtual void onLocalAudioStats(const NERtcAudioSendStats &stats) {
        (void)stats;
    }

    /** 通话中远端音频流的统计信息回调。

     该回调描述远端用户在通话中端到端的音频流统计信息,每 2 秒触发一次。

     @param stats 每个远端用户音频统计信息的数组。详见 NERtcAudioRecvStats.
     @param user_count stats 数组的大小。
     */
    virtual void onRemoteAudioStats(const NERtcAudioRecvStats *stats, unsigned int user_count) {
        (void)stats;
        (void)user_count;
    }

    /** 本地视频流统计信息回调。

    该回调描述本地设备发送视频流的统计信息,每 2 秒触发一次。

     @param stats 本地视频流统计信息。详见 NERtcVideoSendStats.
     */
    virtual void onLocalVideoStats(const NERtcVideoSendStats &stats) {
        (void)stats;
    }

    /** 通话中远端视频流的统计信息回调。

     该回调描述远端用户在通话中端到端的视频流统计信息,每 2 秒触发一次。

     @param stats 每个远端用户视频统计信息的数组。详见 NERtcVideoRecvStats.
     @param user_count stats 数组的大小。
     */
    virtual void onRemoteVideoStats(const NERtcVideoRecvStats *stats, unsigned int user_count) {
        (void)stats;
        (void)user_count;
    }

    /** 通话中每个用户的网络上下行质量报告回调。

     该回调描述每个用户在通话中的网络状态,每 2 秒触发一次,只上报状态有变更的成员。

     @param infos 每个用户 ID 和网络上下行质量信息的数组: NERtcNetworkQualityInfo
     @param user_count infos 数组的大小,即用户数。
     */
    virtual void onNetworkQuality(const NERtcNetworkQualityInfo *infos, unsigned int user_count) {
        (void)infos;
        (void)user_count;
    }
};
} //namespace nertc

 

 重要的有:

1) 当前通话的统计回调

    /** 当前通话统计回调。

    SDK 定期向 App 报告当前通话的统计信息,每 2 秒触发一次。

     @param stats NERTC 引擎统计数据: NERtcStats
     */
    virtual void onRtcStats(const NERtcStats &stats) {
        (void)stats;
    }  

 统计信息如下

/** 通话相关的统计信息。*/
struct NERtcStats
{
    uint32_t cpu_app_usage;     /**< 当前 App 的 CPU 使用率 (%)。*/
    uint32_t cpu_idle_usage;    /**< 当前系统的 CPU 空闲率 (%)。*/
    uint32_t cpu_total_usage;	/**< 当前系统的 CPU 使用率 (%)。*/
    uint32_t memory_app_usage;	/**< 当前App的内存使用率 (%)。*/
    uint32_t memory_total_usage;/**< 当前系统的内存使用率 (%)。*/
    uint32_t memory_app_kbytes;	/**< 当前App的内存使用量 (KB)。*/
    int total_duration;         /**< 通话时长(秒)。*/
    uint64_t tx_bytes;	        /**< 发送字节数,累计值。(bytes)*/
    uint64_t rx_bytes;	        /**< 接收字节数,累计值。(bytes)*/
    uint64_t tx_audio_bytes;	/**< 音频发送字节数,累计值。(bytes)*/
    uint64_t tx_video_bytes;	/**< 视频发送字节数,累计值。(bytes)*/
    uint64_t rx_audio_bytes;	/**< 音频接收字节数,累计值。(bytes)*/
    uint64_t rx_video_bytes;	/**< 视频接收字节数,累计值。(bytes)*/
    int tx_audio_kbitrate;	    /**< 音频发送码率。(kbps)*/
    int rx_audio_kbitrate;	    /**< 音频接收码率。(kbps)*/
    int tx_video_kbitrate;	    /**< 视频发送码率。(kbps)*/
    int rx_video_kbitrate;	    /**< 视频接收码率。(kbps)*/
    int up_rtt;	                /**< 上行平均往返时延rtt(ms) */
    int tx_audio_packet_loss_rate;  /**< 本地上行音频实际丢包率。(%) */
    int tx_video_packet_loss_rate;  /**< 本地上行视频实际丢包率。(%) */
    int tx_audio_packet_loss_sum;   /**< 本地上行音频实际丢包数。 */
    int tx_video_packet_loss_sum;   /**< 本地上行视频实际丢包数。 */
    int tx_audio_jitter;            /**< 本地上行音频抖动计算。(ms) */
    int tx_video_jitter;            /**< 本地上行视频抖动计算。(ms) */
    int rx_audio_packet_loss_rate;  /**< 本地下行音频实际丢包率。(%) */
    int rx_video_packet_loss_rate;  /**< 本地下行视频实际丢包率。(%) */
    int rx_audio_packet_loss_sum;   /**< 本地下行音频实际丢包数。 */
    int rx_video_packet_loss_sum;   /**< 本地下行视频实际丢包数。 */
    int rx_audio_jitter;            /**< 本地下行音频抖动计算。(ms) */
    int rx_video_jitter;            /**< 本地下行视频抖动计算。(ms) */
};

2)通话中每个用户的网络上下行质量报告回调

 

    /** 通话中每个用户的网络上下行质量报告回调。

     该回调描述每个用户在通话中的网络状态,每 2 秒触发一次,只上报状态有变更的成员。

     @param infos 每个用户 ID 和网络上下行质量信息的数组: NERtcNetworkQualityInfo
     @param user_count infos 数组的大小,即用户数。
     */
    virtual void onNetworkQuality(const NERtcNetworkQualityInfo *infos, unsigned int user_count) {
        (void)infos;
        (void)user_count;
    }

 

2.3 使用示例

class StatsObserver : IRtcMediaStatsObserver
{

};

StatsObserver *observer = nullptr;

rtc_engine_->setStatsObserver(observer);

 

 

 

 

 

相关标签: 互动直播