网易互动直播2.0 开发 三 互动事件回调信息
程序员文章站
2022-07-06 20:28:06
...
一 SDK回调信息
初始化参数时,有这么一项
IRtcEngineEventHandlerEx *event_handler; /**< 用于 SDK 向 App 发送回调事件通知。*/
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 注册统计信息观测器
/** 注册统计信息观测器。
@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);
上一篇: 基于twbsPagination.js分页插件使用心得(分享)
下一篇: 概念图--世界末日照片