Skill 126 · Zoom Meeting SDK Windows
Subchapter 126.17
examples/service-quality.mdMarkdown8 KBView on GitHub
Monitor video, audio, and screen sharing quality during meetings to detect network issues and notify users of unstable conditions. Works with both Default UI and Custom UI.
All quality methods return a ConnectionQuality value:
enum ConnectionQuality {
Conn_Quality_Unknown, // Unknown connection status
Conn_Quality_Very_Bad, // Very poor quality
Conn_Quality_Bad, // Poor quality
Conn_Quality_Not_Good, // Not good quality
Conn_Quality_Normal, // Normal quality
Conn_Quality_Good, // Good quality
Conn_Quality_Excellent, // Excellent quality
};Get video connection quality for the local user:
// Get quality of video YOU ARE SENDING
ConnectionQuality sentQuality = meetingService->GetVideoConnQuality(true);
std::cout << "Sent video quality: " << sentQuality << std::endl;
// Get quality of video YOU ARE RECEIVING
ConnectionQuality receivedQuality = meetingService->GetVideoConnQuality(false);
std::cout << "Received video quality: " << receivedQuality << std::endl;Requirements: At least 2 users must be sending/receiving video.
Get audio connection quality for the local user:
// Get quality of audio YOU ARE SENDING
ConnectionQuality sentQuality = meetingService->GetAudioConnQuality(true);
std::cout << "Sent audio quality: " << sentQuality << std::endl;
// Get quality of audio YOU ARE RECEIVING
ConnectionQuality receivedQuality = meetingService->GetAudioConnQuality(false);
std::cout << "Received audio quality: " << receivedQuality << std::endl;Requirements: At least 2 users must be actively sending audio.
Get screen sharing connection quality for the local user:
// Get quality of screen share YOU ARE SENDING
ConnectionQuality sentQuality = meetingService->GetSharingConnQuality(true);
std::cout << "Sent share quality: " << sentQuality << std::endl;
// Get quality of screen share YOU ARE RECEIVING
ConnectionQuality receivedQuality = meetingService->GetSharingConnQuality(false);
std::cout << "Received share quality: " << receivedQuality << std::endl;Requirements: At least 2 users in session, with at least one sharing their screen.
Get quality updates for ALL users (not just local user) via the onUserNetworkStatusChanged callback:
class MeetingServiceEventListener : public IMeetingServiceEvent {
public:
void onUserNetworkStatusChanged(
MeetingComponentType type, // What type: audio, video, or share
ConnectionQuality level, // Quality level
unsigned int userId, // Which user
bool uplink // true=sending, false=receiving
) override {
const char* typeStr = "";
switch (type) {
case MeetingComponentType_AUDIO: typeStr = "Audio"; break;
case MeetingComponentType_VIDEO: typeStr = "Video"; break;
case MeetingComponentType_SHARE: typeStr = "Share"; break;
default: typeStr = "Unknown"; break;
}
std::cout << "[QUALITY] User " << userId
<< " " << typeStr
<< " " << (uplink ? "send" : "receive")
<< " quality: " << level << std::endl;
// Alert user if quality is poor
if (level <= Conn_Quality_Bad) {
std::cout << "[WARNING] Poor " << typeStr << " quality detected!" << std::endl;
}
}
// ... other IMeetingServiceEvent methods
};MeetingComponentType enum:
enum MeetingComponentType {
MeetingComponentType_Def = 0, // Default/unknown
MeetingComponentType_AUDIO, // Audio component
MeetingComponentType_VIDEO, // Video component
MeetingComponentType_SHARE, // Screen share component
};Get detailed statistics (latency, packet loss, etc.) via ISettingService:
// Get setting service
ISettingService* settingService = nullptr;
CreateSettingService(&settingService);
if (settingService) {
IStatisticSettingContext* statsSettings = settingService->GetStatisticSettings();
if (statsSettings) {
// Video statistics
ASVSessionStatisticInfo videoInfo;
statsSettings->QueryVideoStatisticInfo(videoInfo);
std::cout << "Video latency: " << videoInfo.latency << "ms" << std::endl;
std::cout << "Video packet loss: " << videoInfo.packetLossAvg << "%" << std::endl;
// Audio statistics
ASVSessionStatisticInfo audioInfo;
statsSettings->QueryAudioStatisticInfo(audioInfo);
std::cout << "Audio latency: " << audioInfo.latency << "ms" << std::endl;
// Share statistics
ASVSessionStatisticInfo shareInfo;
statsSettings->QueryShareStatisticInfo(shareInfo);
std::cout << "Share latency: " << shareInfo.latency << "ms" << std::endl;
}
}class QualityMonitor : public IMeetingServiceEvent {
public:
QualityMonitor(IMeetingService* meetingService)
: m_meetingService(meetingService) {}
void CheckQuality() {
// Check video quality
ConnectionQuality videoSend = m_meetingService->GetVideoConnQuality(true);
ConnectionQuality videoRecv = m_meetingService->GetVideoConnQuality(false);
// Check audio quality
ConnectionQuality audioSend = m_meetingService->GetAudioConnQuality(true);
ConnectionQuality audioRecv = m_meetingService->GetAudioConnQuality(false);
// Log current status
std::cout << "=== Connection Quality ===" << std::endl;
std::cout << "Video: Send=" << QualityToString(videoSend)
<< ", Recv=" << QualityToString(videoRecv) << std::endl;
std::cout << "Audio: Send=" << QualityToString(audioSend)
<< ", Recv=" << QualityToString(audioRecv) << std::endl;
// Warn if any quality is poor
if (videoSend <= Conn_Quality_Bad || videoRecv <= Conn_Quality_Bad) {
std::cout << "[!] Video quality issues detected" << std::endl;
}
if (audioSend <= Conn_Quality_Bad || audioRecv <= Conn_Quality_Bad) {
std::cout << "[!] Audio quality issues detected" << std::endl;
}
}
// Real-time callback
void onUserNetworkStatusChanged(
MeetingComponentType type,
ConnectionQuality level,
unsigned int userId,
bool uplink
) override {
if (level <= Conn_Quality_Bad) {
std::cout << "[ALERT] Poor network quality for user " << userId << std::endl;
// Could trigger UI notification here
}
}
private:
IMeetingService* m_meetingService;
const char* QualityToString(ConnectionQuality q) {
switch (q) {
case Conn_Quality_Unknown: return "Unknown";
case Conn_Quality_Very_Bad: return "Very Bad";
case Conn_Quality_Bad: return "Bad";
case Conn_Quality_Not_Good: return "Not Good";
case Conn_Quality_Normal: return "Normal";
case Conn_Quality_Good: return "Good";
case Conn_Quality_Excellent: return "Excellent";
default: return "Unknown";
}
}
// ... implement other required IMeetingServiceEvent methods
};Last Updated: Based on Zoom Windows Meeting SDK v6.7.2.26830