CINXE.COM

Video SDK - web - Service quality - Zoom Developers

<!DOCTYPE html><html lang="en-US"><head><meta charSet="utf-8"/><title>Video SDK - web - Service quality - Zoom Developers</title><meta name="viewport" content="width=device-width, height=device-height, initial-scale=1"/><meta name="description" content="The Zoom Developer Platform is an open platform that allows third-party developers to build applications and integrations upon Zoom’s video-first unified communications platform."/><meta name="keywords" content="zoom, marketplace.zoom.us, api, sdk, jwt, oauth, rest, develop, developer, zoom developer, video conferencing, video conference, online meetings, web meeting, video meeting, cloud meeting, cloud video, group video call, group video chat, screen share, application share"/><link rel="icon" href="/svgs/favicon.svg"/><meta property="og:image" content="https://developers.zoom.us/img/logos/ogimage_primary.png"/><meta property="og:site_name" content="Zoom"/><meta property="og:locale" content="en_US"/><meta property="og:type" content="website"/><meta property="og:title" content="Video SDK - web - Service quality - Zoom Developers"/><meta property="og:description" content="The Zoom Developer Platform is an open platform that allows third-party developers to build applications and integrations upon Zoom’s video-first unified communications platform."/><meta property="og:url" content="https://developers.zoom.us/docs/video-sdk/web/quality/"/><link rel="canonical" href="https://developers.zoom.us/docs/video-sdk/web/quality/"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:site" content="@zoom"/><meta name="twitter:title" content="Video SDK - web - Service quality - Zoom Developers"/><meta name="twitter:description" content="The Zoom Developer Platform is an open platform that allows third-party developers to build applications and integrations upon Zoom’s video-first unified communications platform."/><meta name="twitter:creator" content="@zoom"/><meta name="twitter:image" content="https://developers.zoom.us/img/logos/ogimage_primary.png"/><script type="application/ld+json">{&quot;@context&quot;:&quot;https://schema.org&quot;,&quot;@type&quot;:&quot;WebPage&quot;,&quot;url&quot;:&quot;https://developers.zoom.us&quot;,&quot;inLanguage&quot;:&quot;en&quot;,&quot;mainEntityOfPage&quot;:&quot;https://developers.zoom.us&quot;,&quot;description&quot;:&quot;The Zoom Developer Platform is an open platform that allows third-party developers to build applications and integrations upon Zoom’s video-first unified communications platform.&quot;,&quot;name&quot;:&quot;Zoom Developer Docs&quot;,&quot;publisher&quot;:{&quot;@type&quot;:&quot;Organization&quot;,&quot;name&quot;:&quot;Zoom&quot;,&quot;legalName&quot;:&quot;Zoom Video Communications LLC&quot;,&quot;url&quot;:&quot;https://zoom.us&quot;},&quot;copyrightHolder&quot;:{&quot;@type&quot;:&quot;Organization&quot;,&quot;name&quot;:&quot;Zoom&quot;,&quot;legalName&quot;:&quot;Zoom Video Communications LLC&quot;,&quot;url&quot;:&quot;https://zoom.us&quot;},&quot;copyrightYear&quot;:&quot;2024&quot;}</script><script type="application/ld+json">{&quot;@context&quot;:&quot;https://schema.org&quot;,&quot;@type&quot;:&quot;BreadcrumbList&quot;,&quot;description&quot;:&quot;Breadcrumbs&quot;,&quot;name&quot;:&quot;Breadcrumbs&quot;,&quot;itemListElement&quot;:[{&quot;@type&quot;:&quot;ListItem&quot;,&quot;item&quot;:{&quot;@id&quot;:&quot;https://developers.zoom.us&quot;,&quot;name&quot;:&quot;Docs&quot;},&quot;position&quot;:1},{&quot;@type&quot;:&quot;ListItem&quot;,&quot;item&quot;:{&quot;@id&quot;:&quot;https://developers.zoom.us/docs&quot;,&quot;name&quot;:&quot;docs&quot;},&quot;position&quot;:2},{&quot;@type&quot;:&quot;ListItem&quot;,&quot;item&quot;:{&quot;@id&quot;:&quot;https://developers.zoom.us/video-sdk/web&quot;,&quot;name&quot;:&quot;web&quot;},&quot;position&quot;:3}]}</script><meta name="next-head-count" content="22"/><link rel="preload" href="/_next/static/media/bd6032b1b40f0a94-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/af073f67ef00f79b-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/d7bb3f33f2a2c6c3-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/16b6856090fc2493-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/1f8417796774370d-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/c9b3cfca7ff374b5-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/15adc2398e9c1f2c-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/d4676da4caa387c7-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/45e87576965bc150-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/ea53a1bc12a0c88a-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/8e6e8d6c13eb004a-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/e31544f452c551d7-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/a20cb60d2c11d6e5-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/9946c3afdd2d21f1-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/d1aaf2a6a913fa31-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/css/af7550f8ddc91701.css" as="style" crossorigin=""/><link rel="stylesheet" href="/_next/static/css/af7550f8ddc91701.css" crossorigin="" data-n-g=""/><link rel="preload" href="/_next/static/css/40828f1fe5a66aa7.css" as="style" crossorigin=""/><link rel="stylesheet" href="/_next/static/css/40828f1fe5a66aa7.css" crossorigin="" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" crossorigin="" nomodule="" src="/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script><script src="https://cdn.cookielaw.org/scripttemplates/otSDKStub.js" type="text/javascript" charSet="UTF-8" data-domain-script="b0bfa2ae-4058-4aef-8632-a5281ce4464a" defer="" data-nscript="beforeInteractive" crossorigin=""></script><script src="/_next/static/chunks/webpack-d0624c5963c93613.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/framework-ca706bf673a13738.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/main-61ded8d942661fc0.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/pages/_app-7415c61298767f7f.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/11e07bb4-65f3c1cbff722f6c.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/718-ad49a62636f00526.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/3817-d6d568a8dda7ffcb.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/4038-e32748e2d0a0996d.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/4749-ec9252ab0d3ed683.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/1183-3a4084fa03711ca2.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/2476-7fafc63cc04fb715.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/8234-d72877bdaf02566f.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/302-cb5695a08df80245.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/6790-f496dceda53ba151.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/9095-81a120684ed3cf9b.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/6577-4ada4cb4c53af17c.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/5150-4aa99fbd0b60437e.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/4710-f26cf1386efec54b.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/pages/docs/%5B...slug%5D-2e841feccbbd0932.js" defer="" crossorigin=""></script><script src="/_next/static/2024-11-26%20T%2010-50-37/_buildManifest.js" defer="" crossorigin=""></script><script src="/_next/static/2024-11-26%20T%2010-50-37/_ssgManifest.js" defer="" crossorigin=""></script></head><body><div id="__next"><div class="__variable_b9f6b0 __variable_9ef0d0"><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NQHCZ9Z" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><div></div></div></div><script id="__NEXT_DATA__" type="application/json" crossorigin="">{"props":{"pageProps":{"mainContent":{"code":"var Component=(()=\u003e{var m=Object.create;var s=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,b=Object.prototype.hasOwnProperty;var f=(i,e)=\u003e()=\u003e(e||i((e={exports:{}}).exports,e),e.exports),v=(i,e)=\u003e{for(var n in e)s(i,n,{get:e[n],enumerable:!0})},d=(i,e,n,a)=\u003e{if(e\u0026\u0026typeof e==\"object\"||typeof e==\"function\")for(let r of g(e))!b.call(i,r)\u0026\u0026r!==n\u0026\u0026s(i,r,{get:()=\u003ee[r],enumerable:!(a=p(e,r))||a.enumerable});return i};var k=(i,e,n)=\u003e(n=i!=null?m(y(i)):{},d(e||!i||!i.__esModule?s(n,\"default\",{value:i,enumerable:!0}):n,i)),w=i=\u003ed(s({},\"__esModule\",{value:!0}),i);var c=f((D,l)=\u003e{l.exports=_jsx_runtime});var x={};v(x,{default:()=\u003e_,frontmatter:()=\u003eq});var t=k(c());var{useMDXComponents:o}=MdxJsReact;var q={title:\"Video SDK - web - Service quality\"};function h(i){let e=Object.assign({h1:\"h1\",p:\"p\",a:\"a\",h2:\"h2\",i:\"i\",code:\"code\",ul:\"ul\",li:\"li\",pre:\"pre\",strong:\"strong\",h3:\"h3\"},o(),i.components),{Image:n,NextSteps:a}=e;return n||u(\"Image\",!0),a||u(\"NextSteps\",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(e.h1,{id:\"service-quality\",children:\"Service quality\"}),`\n`,(0,t.jsx)(e.p,{children:\"You can use the service quality event listeners to get insights on network, video, audio, and screen sharing quality during a session. You can use these to measure or show latency, FPS, and resolution. Zoom Video SDK optimizes the FPS and resolution to the current device and network capabilities to optimize a good, smooth experience.\"}),`\n`,(0,t.jsxs)(e.p,{children:[\"You can also use these to build network strength indicators for your users or a real time statistics dashboard of video, audio, and screen share quality. This is similar to \",(0,t.jsx)(e.a,{href:\"https://support.zoom.us/hc/en-us/articles/202920719-Accessing-meeting-and-phone-statistics\",children:\"how Zoom Meetings shares diagnostic information\"}),\".\"]}),`\n`,(0,t.jsxs)(e.p,{children:[\"You can also \",(0,t.jsx)(e.a,{href:\"#report-issues-to-zoom\",children:\"report issues to Zoom\"}),\" using the client-side telemetry issue report function.\"]}),`\n`,(0,t.jsxs)(e.h2,{id:\"network-quality\",children:[\"Network quality\",(0,t.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#network-quality\",children:(0,t.jsx)(e.i,{className:\"bi-link-45deg\",\"aria-hidden\":\"true\"})})]}),`\n`,(0,t.jsxs)(e.p,{children:[\"The \",(0,t.jsx)(e.a,{href:\"https://marketplacefront.zoom.us/sdk/custom/web/modules.html#event_network_quality_change\",children:(0,t.jsx)(e.code,{children:\"network-quality-change\"})}),\" event listener returns a user's video network quality, as an uplink and downlink score. The scores are measured from 0-5, poor to strong:\"]}),`\n`,(0,t.jsxs)(e.ul,{children:[`\n`,(0,t.jsx)(e.li,{children:\"0-1: poor quality\"}),`\n`,(0,t.jsx)(e.li,{children:\"2: normal quality\"}),`\n`,(0,t.jsx)(e.li,{children:\"3-5: good quality\"}),`\n`]}),`\n`,(0,t.jsx)(e.p,{children:\"You can use this event listener to create a connection signal icon or notify the end user if their network is unstable. To get a network quality score, there must be at least two users in the session with their video on.\"}),`\n`,(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:\"language-js\",children:`client.on('network-quality-change', (payload) =\u003e {\n\tconsole.log(payload)\n})\n`})}),`\n`,(0,t.jsx)(e.p,{children:\"For example, you can display your own network uplink and downlink strength. You can use this to notify users they have a weak connection so they understand why they may not be able to hear or view video smoothly.\"}),`\n`,(0,t.jsx)(n,{src:\"/img/vsdk-web-bp6-stats.png\",alt:\"Show network signal strength and audio and video statistics\",width:400}),`\n`,(0,t.jsxs)(e.p,{children:[\"Use the \",(0,t.jsx)(e.a,{href:\"https://marketplacefront.zoom.us/sdk/custom/web/modules.html#event_connection_change\",children:(0,t.jsx)(e.code,{children:\"connection-change\"})}),\" event listener to get informed if the SDK disconnects the user for network reasons.\"]}),`\n`,(0,t.jsxs)(e.h2,{id:\"video-quality\",children:[\"Video quality\",(0,t.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#video-quality\",children:(0,t.jsx)(e.i,{className:\"bi-link-45deg\",\"aria-hidden\":\"true\"})})]}),`\n`,(0,t.jsxs)(e.p,{children:[\"The \",(0,t.jsx)(e.a,{href:\"https://marketplacefront.zoom.us/sdk/custom/web/modules.html#event_video_statistic_data_change\",children:(0,t.jsx)(e.code,{children:\"video-statistic-data-change\"})}),\" event listener returns a user's video quality, such as frames per second (FPS) and resolution. When the encoding property is \",(0,t.jsx)(e.code,{children:\"false\"}),\", the payload is the video quality data you are receiving. When \",(0,t.jsx)(e.code,{children:\"true\"}),\", the payload is the video quality data you are sending.\"]}),`\n`,(0,t.jsx)(n,{src:\"/img/vsdk-web-quality-video.png\",alt:\"Video SDK video statistic data example user interface\",width:400}),`\n`,(0,t.jsxs)(e.p,{children:[\"To receive this data, there must be at least two users in the session with their video on, and you must subscribe to the event. Call \",(0,t.jsx)(e.code,{children:\"session.subscribeVideoStatisticData()\"}),\" to subscribe.\"]}),`\n`,(0,t.jsx)(e.p,{children:\"By default this returns the highest FPS and resolution being sent and received by users.\"}),`\n`,(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:\"language-js\",children:`session.subscribeVideoStatisticData() \n\nclient.on(\\u2018video-statistic-data-change', (payload) =\u003e {\n console.log(payload)\n })\n`})}),`\n`,(0,t.jsxs)(e.p,{children:[\"To get per user FPS and resolution, pass the \",(0,t.jsx)(e.code,{children:\"{detailed: true}\"}),\" property into \",(0,t.jsx)(e.code,{children:\"session.subscribeVideoStatisticData()\"}),\" and listen to the \",(0,t.jsx)(e.code,{children:\"video-detailed-data-change\"}),\" event. This sends data about each video tile. It consumes more CPU and memory so it may be more useful during development.\"]}),`\n`,(0,t.jsxs)(e.h2,{id:\"audio-quality\",children:[\"Audio quality\",(0,t.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#audio-quality\",children:(0,t.jsx)(e.i,{className:\"bi-link-45deg\",\"aria-hidden\":\"true\"})})]}),`\n`,(0,t.jsxs)(e.p,{children:[\"The \",(0,t.jsx)(e.a,{href:\"https://marketplacefront.zoom.us/sdk/custom/web/modules.html#event_audio_statistic_data_change\",children:(0,t.jsx)(e.code,{children:\"audio-statistic-data-change\"})}),\" event listener returns a user's audio quality, such as packet loss and sample rate. When the encoding property is \",(0,t.jsx)(e.code,{children:\"false\"}),\", the payload is the audio quality data you are receiving. When \",(0,t.jsx)(e.code,{children:\"true\"}),\", the payload is the audio quality data you are sending.\"]}),`\n`,(0,t.jsx)(n,{src:\"/img/vsdk-web-quality-audio.png\",alt:\"Video SDK audio statistic data example user interface\",width:400}),`\n`,(0,t.jsxs)(e.p,{children:[\"To receive this data, there must be at least two users in the session with their audio connected, and you must subscribe to the event. Call \",(0,t.jsx)(e.code,{children:\"session.subscribeAudioStatisticData()\"}),\" to subscribe.\"]}),`\n`,(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:\"language-js\",children:`session.subscribeAudioStatisticData()\n\nclient.on('audio-statistic-data-change', (payload) =\u003e {\n console.log(payload)\n })\n`})}),`\n`,(0,t.jsxs)(e.h2,{id:\"screen-sharing-quality\",children:[\"Screen sharing quality\",(0,t.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#screen-sharing-quality\",children:(0,t.jsx)(e.i,{className:\"bi-link-45deg\",\"aria-hidden\":\"true\"})})]}),`\n`,(0,t.jsxs)(e.p,{children:[\"The \",(0,t.jsx)(e.a,{href:\"https://marketplacefront.zoom.us/sdk/custom/web/modules.html#event_share_statistic_data_change\",children:(0,t.jsx)(e.code,{children:\"share-statistic-data-change\"})}),\" event listener returns a user's screen sharing quality. When the encoding property is \",(0,t.jsx)(e.code,{children:\"false\"}),\", the payload is the screen sharing quality data you are receiving. When \",(0,t.jsx)(e.code,{children:\"true\"}),\", the payload is the screen sharing quality data you are sending.\"]}),`\n`,(0,t.jsx)(n,{src:\"/img/vsdk-web-quality-share.png\",alt:\"Video SDK screen sharing statistic data example user interface\",width:400}),`\n`,(0,t.jsxs)(e.p,{children:[\"To receive this data, there must be at least two users in the session with one sharing their screen, and you must subscribe to the event. Call \",(0,t.jsx)(e.code,{children:\"session.subscribeShareStatisticData()\"}),\" to subscribe.\"]}),`\n`,(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:\"language-js\",children:`session.subscribeShareStatisticData()\n\nclient.on(share-statistic-data-change', (payload) =\u003e {\n console.log(payload)\n })\n`})}),`\n`,(0,t.jsxs)(e.h2,{id:\"report-issues-to-zoom\",children:[\"Report issues to Zoom\",(0,t.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#report-issues-to-zoom\",children:(0,t.jsx)(e.i,{className:\"bi-link-45deg\",\"aria-hidden\":\"true\"})})]}),`\n`,(0,t.jsxs)(e.p,{children:[\"Enable a detailed Video SDK client-side debugging log and report to be sent to Zoom. This helps increase visibility into any client-side connection issues, crashes, and other issues, and enables Zoom to investigate and fix issues quickly. This is similar to the \",(0,t.jsx)(e.a,{href:\"https://support.zoom.com/hc/en/article?id=zm_kb\u0026sysparm_article=KB0060047\",children:\"report Zoom problem capability in Zoom Meetings and Webinars\"}),\".\"]}),`\n`,(0,t.jsxs)(e.p,{children:[\"The detailed issue report includes the device information, network condition, parameters, the return value of each method that was called, and other items. Developers must send detailed logs to Zoom using a report function. \",(0,t.jsx)(e.strong,{children:\"You must provide an in-product notice to your end-users and give users the ability to opt-out prior to sending detailed reports to Zoom.\"})]}),`\n`,(0,t.jsxs)(e.p,{children:[\"You can use this to build a \\u201CReport an Issue\\u201D button that calls \",(0,t.jsx)(e.a,{href:\"https://marketplacefront.zoom.us/sdk/custom/web/modules/LoggerClient.html#reportToGlobalTracing\",children:(0,t.jsx)(e.code,{children:\"reportToGlobalTracing\"})}),\".\"]}),`\n`,(0,t.jsxs)(e.h3,{id:\"set-tracking-id\",children:[\"Set tracking ID\",(0,t.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#set-tracking-id\",children:(0,t.jsx)(e.i,{className:\"bi-link-45deg\",\"aria-hidden\":\"true\"})})]}),`\n`,(0,t.jsxs)(e.p,{children:[\"In your \",(0,t.jsx)(e.a,{href:\"/docs/video-sdk/auth/\",children:\"Video SDK JWT payload\"}),\", add a \",(0,t.jsx)(e.code,{children:\"telemetry_tracking_id\"}),\" property, with a UUID for each session so that Zoom can identify issues for at a participant-level. We recommend \",(0,t.jsx)(e.a,{href:\"https://datatracker.ietf.org/doc/html/rfc4122\",children:\"version 1 as described in rfc4122\"}),\". Here's an example of what that may look like.\"]}),`\n`,(0,t.jsx)(e.p,{children:(0,t.jsx)(e.code,{children:'telemetry_tracking_id: \"a8b7f844-1d32-4eeb-93a4-785a77f49428\"'})}),`\n`,(0,t.jsx)(e.p,{children:\"This enables Zoom to receive detailed telemetry reports. Without a tracking ID, you will not be able to send detailed reports.\"}),`\n`,(0,t.jsxs)(e.h3,{id:\"init-telemetry-client\",children:[\"Init telemetry client\",(0,t.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#init-telemetry-client\",children:(0,t.jsx)(e.i,{className:\"bi-link-45deg\",\"aria-hidden\":\"true\"})})]}),`\n`,(0,t.jsxs)(e.p,{children:[\"After joining a session, call \",(0,t.jsx)(e.code,{children:\"client.getLoggerClient()\"}),\" to get the client-side telemetry client.\"]}),`\n`,(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:\"language-js\",children:`const clientSideTelemetry = client.getLoggerClient()\n`})}),`\n`,(0,t.jsxs)(e.h3,{id:\"send-detailed-issue-report-to-zoom\",children:[\"Send detailed issue report to Zoom\",(0,t.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#send-detailed-issue-report-to-zoom\",children:(0,t.jsx)(e.i,{className:\"bi-link-45deg\",\"aria-hidden\":\"true\"})})]}),`\n`,(0,t.jsx)(e.p,{children:\"To send a detailed client-side telemetry report to Zoom\\u2019s logging service, call the following method.\"}),`\n`,(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:\"language-js\",children:`clientSideTelemetry.reportToGlobalTracing()\n`})}),`\n`,(0,t.jsxs)(e.h2,{id:\"collect-user-rating-feedback\",children:[\"Collect user rating feedback\",(0,t.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#collect-user-rating-feedback\",children:(0,t.jsx)(e.i,{className:\"bi-link-45deg\",\"aria-hidden\":\"true\"})})]}),`\n`,(0,t.jsxs)(e.p,{children:[\"Zoom Meetings have a subjective \",(0,t.jsx)(e.a,{href:\"https://support.zoom.com/hc/en/article?id=zm_kb\u0026sysparm_article=KB0067520\",children:\"end-of-meeting experience feedback survey\"}),\" that's useful to gauge meeting quality in order to improve it.\"]}),`\n`,(0,t.jsxs)(e.p,{children:[\"You can create a similar survey for Video SDK sessions. Use a score of 1-5; 1 indicating the worst score and 5 indicating the best, and an option for a feedback string. Report the rating to Zoom using the\\xA0\",(0,t.jsx)(e.a,{href:\"https://marketplacefront.zoom.us/sdk/custom/web/modules/LoggerClient.html#reportRating\",children:(0,t.jsx)(e.code,{children:\"reportRating\"})}),\"\\xA0method. Zoom will investigate the quality of the session if the score was low.\"]}),`\n`,(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:\"language-js\",children:`clientSideTelemetry.reportRating(5, \"Video quality was great!\")\nclientSideTelemetry.reportRating(3, \"Video quality was ok.\")\nclientSideTelemetry.reportRating(1, \"There were issues with the video quality.\")\n`})}),`\n`,(0,t.jsx)(a,{steps:[{title:\"SharedArrayBuffer\",to:\"/docs/video-sdk/web/sharedarraybuffer/\"}]})]})}function S(i={}){let{wrapper:e}=Object.assign({},o(),i.components);return e?(0,t.jsx)(e,Object.assign({},i,{children:(0,t.jsx)(h,i)})):h(i)}var _=S;function u(i,e){throw new Error(\"Expected \"+(e?\"component\":\"object\")+\" `\"+i+\"` to be defined: you likely forgot to import, pass, or provide it.\")}return w(x);})();\n;return Component;","frontmatter":{"title":"Video SDK - web - Service quality"},"errors":[],"matter":{"content":"\n# Service quality\n\nYou can use the service quality event listeners to get insights on network, video, audio, and screen sharing quality during a session. You can use these to measure or show latency, FPS, and resolution. Zoom Video SDK optimizes the FPS and resolution to the current device and network capabilities to optimize a good, smooth experience.\n\nYou can also use these to build network strength indicators for your users or a real time statistics dashboard of video, audio, and screen share quality. This is similar to [how Zoom Meetings shares diagnostic information](https://support.zoom.us/hc/en-us/articles/202920719-Accessing-meeting-and-phone-statistics).\n\nYou can also [report issues to Zoom](#report-issues-to-zoom) using the client-side telemetry issue report function.\n\n## Network quality\n\nThe [`network-quality-change`](https://marketplacefront.zoom.us/sdk/custom/web/modules.html#event_network_quality_change) event listener returns a user's video network quality, as an uplink and downlink score. The scores are measured from 0-5, poor to strong:\n\n* 0-1: poor quality\n* 2: normal quality\n* 3-5: good quality\n\nYou can use this event listener to create a connection signal icon or notify the end user if their network is unstable. To get a network quality score, there must be at least two users in the session with their video on.\n\n```js\nclient.on('network-quality-change', (payload) =\u003e {\n\tconsole.log(payload)\n})\n```\n\nFor example, you can display your own network uplink and downlink strength. You can use this to notify users they have a weak connection so they understand why they may not be able to hear or view video smoothly.\n\n \u003cImage\n src=\"/img/vsdk-web-bp6-stats.png\"\n alt=\"Show network signal strength and audio and video statistics\"\n width={400}\n /\u003e\n\nUse the [`connection-change`](https://marketplacefront.zoom.us/sdk/custom/web/modules.html#event_connection_change) event listener to get informed if the SDK disconnects the user for network reasons.\n\n## Video quality\n\nThe [`video-statistic-data-change`](https://marketplacefront.zoom.us/sdk/custom/web/modules.html#event_video_statistic_data_change) event listener returns a user's video quality, such as frames per second (FPS) and resolution. When the encoding property is `false`, the payload is the video quality data you are receiving. When `true`, the payload is the video quality data you are sending.\n\n\u003cImage\n src=\"/img/vsdk-web-quality-video.png\"\n alt=\"Video SDK video statistic data example user interface\"\n width={400}\n/\u003e\n\nTo receive this data, there must be at least two users in the session with their video on, and you must subscribe to the event. Call `session.subscribeVideoStatisticData()` to subscribe.\n\nBy default this returns the highest FPS and resolution being sent and received by users.\n\n```js\nsession.subscribeVideoStatisticData() \n\nclient.on(‘video-statistic-data-change', (payload) =\u003e {\n console.log(payload)\n })\n```\n\nTo get per user FPS and resolution, pass the `{detailed: true}` property into `session.subscribeVideoStatisticData()` and listen to the `video-detailed-data-change` event. This sends data about each video tile. It consumes more CPU and memory so it may be more useful during development.\n\n## Audio quality\n\nThe [`audio-statistic-data-change`](https://marketplacefront.zoom.us/sdk/custom/web/modules.html#event_audio_statistic_data_change) event listener returns a user's audio quality, such as packet loss and sample rate. When the encoding property is `false`, the payload is the audio quality data you are receiving. When `true`, the payload is the audio quality data you are sending.\n\n\u003cImage\n src=\"/img/vsdk-web-quality-audio.png\"\n alt=\"Video SDK audio statistic data example user interface\"\n width={400}\n/\u003e\n\nTo receive this data, there must be at least two users in the session with their audio connected, and you must subscribe to the event. Call `session.subscribeAudioStatisticData()` to subscribe. \n\n```js\nsession.subscribeAudioStatisticData()\n\nclient.on('audio-statistic-data-change', (payload) =\u003e {\n console.log(payload)\n })\n```\n\n## Screen sharing quality\n\nThe [`share-statistic-data-change`](https://marketplacefront.zoom.us/sdk/custom/web/modules.html#event_share_statistic_data_change) event listener returns a user's screen sharing quality. When the encoding property is `false`, the payload is the screen sharing quality data you are receiving. When `true`, the payload is the screen sharing quality data you are sending.\n\n\u003cImage\n src=\"/img/vsdk-web-quality-share.png\"\n alt=\"Video SDK screen sharing statistic data example user interface\"\n width={400}\n/\u003e\n\nTo receive this data, there must be at least two users in the session with one sharing their screen, and you must subscribe to the event. Call `session.subscribeShareStatisticData()` to subscribe. \n\n```js\nsession.subscribeShareStatisticData()\n\nclient.on(share-statistic-data-change', (payload) =\u003e {\n console.log(payload)\n })\n```\n\n## Report issues to Zoom\n\nEnable a detailed Video SDK client-side debugging log and report to be sent to Zoom. This helps increase visibility into any client-side connection issues, crashes, and other issues, and enables Zoom to investigate and fix issues quickly. This is similar to the [report Zoom problem capability in Zoom Meetings and Webinars](https://support.zoom.com/hc/en/article?id=zm_kb\u0026sysparm_article=KB0060047).\n\nThe detailed issue report includes the device information, network condition, parameters, the return value of each method that was called, and other items. Developers must send detailed logs to Zoom using a report function. **You must provide an in-product notice to your end-users and give users the ability to opt-out prior to sending detailed reports to Zoom.**\n\nYou can use this to build a “Report an Issue” button that calls [`reportToGlobalTracing`](https://marketplacefront.zoom.us/sdk/custom/web/modules/LoggerClient.html#reportToGlobalTracing).\n\n### Set tracking ID\n\nIn your [Video SDK JWT payload](/docs/video-sdk/auth/), add a `telemetry_tracking_id` property, with a UUID for each session so that Zoom can identify issues for at a participant-level. We recommend [version 1 as described in rfc4122](https://datatracker.ietf.org/doc/html/rfc4122). Here's an example of what that may look like.\n\n`telemetry_tracking_id: \"a8b7f844-1d32-4eeb-93a4-785a77f49428\"`\n\nThis enables Zoom to receive detailed telemetry reports. Without a tracking ID, you will not be able to send detailed reports.\n\n### Init telemetry client\n\nAfter joining a session, call `client.getLoggerClient()` to get the client-side telemetry client. \n\n```js\nconst clientSideTelemetry = client.getLoggerClient()\n```\n\n### Send detailed issue report to Zoom\n\nTo send a detailed client-side telemetry report to Zoom’s logging service, call the following method.\n\n```js\nclientSideTelemetry.reportToGlobalTracing()\n```\n\n## Collect user rating feedback\n\nZoom Meetings have a subjective [end-of-meeting experience feedback survey](https://support.zoom.com/hc/en/article?id=zm_kb\u0026sysparm_article=KB0067520) that's useful to gauge meeting quality in order to improve it.\n\nYou can create a similar survey for Video SDK sessions. Use a score of 1-5; 1 indicating the worst score and 5 indicating the best, and an option for a feedback string. Report the rating to Zoom using the [`reportRating`](https://marketplacefront.zoom.us/sdk/custom/web/modules/LoggerClient.html#reportRating) method. Zoom will investigate the quality of the session if the score was low.\n\n```js\nclientSideTelemetry.reportRating(5, \"Video quality was great!\")\nclientSideTelemetry.reportRating(3, \"Video quality was ok.\")\nclientSideTelemetry.reportRating(1, \"There were issues with the video quality.\")\n```\n\n\u003cNextSteps\n steps={[\n {\n title: 'SharedArrayBuffer',\n to: '/docs/video-sdk/web/sharedarraybuffer/'\n }\n ]}\n/\u003e\n","data":{"title":"Video SDK - web - Service quality"},"isEmpty":false,"excerpt":"","path":"./content/docs/video-sdk/web/quality.mdx"}},"sidebarName":"video-sdk"},"__N_SSG":true},"page":"/docs/[...slug]","query":{"slug":["video-sdk","web","quality"]},"buildId":"2024-11-26 T 10-50-37","isFallback":false,"gsp":true,"scriptLoader":[]}</script></body></html>