{"id":39254,"date":"2025-11-10T14:49:47","date_gmt":"2025-11-10T22:49:47","guid":{"rendered":"https:\/\/cloudinary.com\/blog\/?p=39254"},"modified":"2025-11-10T14:50:09","modified_gmt":"2025-11-10T22:50:09","slug":"how-to-make-videos-accessible-wcag","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/","title":{"rendered":"How to make videos accessible (WCAG)?"},"content":{"rendered":"\n<p>A common thread in dev communities right now: teams ship great video content, then realize some users cannot access it without captions, transcripts, keyboard controls, or audio descriptions. Accessibility is not just compliance, it is usability and reach.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Question:<\/h2>\n\n\n\n<p><em>Hi folks, I am updating our video player and need practical guidance on accessibility. Specifically: How to make videos accessible, and what is WCAG? I am looking for a concrete checklist and examples that cover captions, transcripts, audio descriptions, keyboard navigation, and format choices.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Answer:<\/h2>\n\n\n\n<p>The Web Content Accessibility Guidelines (WCAG) focuses on making web content like videos and other media accessible for everyone. It\u2019s a <a href=\"https:\/\/www.w3.org\/WAI\/standards-guidelines\/wcag\/\">technical standard<\/a> maintained by the World Wide Web Consortium (W3C), and outlines how websites should approach displaying content.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">WCAG-aligned checklist for video<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Captions for prerecorded video with audio. Live captions when feasible.<\/li>\n\n\n\n<li>Audio descriptions or a described version for essential visual information.<\/li>\n\n\n\n<li>Transcript that includes dialogue and meaningful visuals, linked near the player.<\/li>\n\n\n\n<li>Keyboard accessible controls, visible focus, and logical tab order.<\/li>\n\n\n\n<li>No auto-play with audio. If you must auto-play, provide a clear pause or stop.<\/li>\n\n\n\n<li>Adjustable playback speed, volume, and caption styling if you use a custom UI.<\/li>\n\n\n\n<li>Format and delivery that work across devices and bandwidths.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Reference HTML implementation<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">figure<\/span>&gt;<\/span>\n\n\u00a0\u00a0<span class=\"hljs-comment\">&lt;!-- The &lt;video&gt; element provides the main media content with user controls --&gt;<\/span>\n\n\u00a0\u00a0<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">video<\/span>\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"howto-video\"<\/span>\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">\"640\"<\/span>\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-attr\">controls<\/span>\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-attr\">preload<\/span>=<span class=\"hljs-string\">\"metadata\"<\/span>\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-attr\">poster<\/span>=<span class=\"hljs-string\">\"thumbnail.jpg\"<\/span>\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-attr\">aria-describedby<\/span>=<span class=\"hljs-string\">\"howto-caption\"<\/span>\n\n\u00a0\u00a0&gt;<\/span>\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-comment\">&lt;!-- Source for the main video file --&gt;<\/span>\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">source<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"example-video.mp4\"<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"video\/mp4\"<\/span> \/&gt;<\/span>\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-comment\">&lt;!-- Captions track for viewers who are deaf or hard of hearing --&gt;<\/span>\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">track<\/span>\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"captions-en.vtt\"<\/span>\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-attr\">kind<\/span>=<span class=\"hljs-string\">\"captions\"<\/span>\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-attr\">srclang<\/span>=<span class=\"hljs-string\">\"en\"<\/span>\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-attr\">label<\/span>=<span class=\"hljs-string\">\"English captions\"<\/span>\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-attr\">default<\/span>\n\n\u00a0\u00a0\u00a0\u00a0\/&gt;<\/span>\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-comment\">&lt;!-- Audio descriptions track for users who are blind or have low vision --&gt;<\/span>\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">track<\/span>\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"descriptions-en.vtt\"<\/span>\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-attr\">kind<\/span>=<span class=\"hljs-string\">\"descriptions\"<\/span>\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-attr\">srclang<\/span>=<span class=\"hljs-string\">\"en\"<\/span>\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-attr\">label<\/span>=<span class=\"hljs-string\">\"Audio descriptions\"<\/span>\n\n\u00a0\u00a0\u00a0\u00a0\/&gt;<\/span>\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-comment\">&lt;!-- Fallback text and links for browsers that don't support video --&gt;<\/span>\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Your browser does not support HTML5 video. Watch the\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"example-video.mp4\"<\/span>&gt;<\/span>MP4<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span> or read the\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"transcript.html\"<\/span>&gt;<\/span>transcript<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>.\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n\n\u00a0\u00a0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">video<\/span>&gt;<\/span>\n\n\u00a0\u00a0<span class=\"hljs-comment\">&lt;!-- Figure caption provides context and acts as a video label --&gt;<\/span>\n\n\u00a0\u00a0<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">figcaption<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"howto-caption\"<\/span>&gt;<\/span>\n\n\u00a0\u00a0\u00a0\u00a0How to froth milk for lattes\n\n\u00a0\u00a0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">figcaption<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">figure<\/span>&gt;<\/span>\n\n<span class=\"hljs-comment\">&lt;!-- Links to additional accessible resources: full transcript and described version --&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n\n\u00a0\u00a0<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"transcript.html\"<\/span>&gt;<\/span>Full transcript<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span> \u2022\n\n\u00a0\u00a0<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"example-video-described.mp4\"<\/span>&gt;<\/span>Audio-described version<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Keyboard support for custom UIs<\/h3>\n\n\n\n<p>Native controls are keyboard accessible. If you build a custom UI, wire up common shortcuts:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-keyword\">const<\/span> v = <span class=\"hljs-built_in\">document<\/span>.getElementById(<span class=\"hljs-string\">'product-video'<\/span>);\n<span class=\"hljs-built_in\">document<\/span>.addEventListener(<span class=\"hljs-string\">'keydown'<\/span>, e =&gt; {\n\u00a0 <span class=\"hljs-keyword\">if<\/span> (<span class=\"hljs-built_in\">document<\/span>.activeElement !== v) <span class=\"hljs-keyword\">return<\/span>;\n\u00a0 <span class=\"hljs-keyword\">switch<\/span> (e.key) {\n\u00a0 \u00a0 <span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">' '<\/span>:\n\u00a0 \u00a0 \u00a0 e.preventDefault();\n\u00a0 \u00a0 \u00a0 v.paused ? v.play() : v.pause();\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-keyword\">break<\/span>;\n\u00a0 \u00a0 <span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'ArrowRight'<\/span>:\n\u00a0 \u00a0 \u00a0 v.currentTime += <span class=\"hljs-number\">5<\/span>;\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-keyword\">break<\/span>;\n\u00a0 \u00a0 <span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'ArrowLeft'<\/span>:\n\u00a0 \u00a0 \u00a0 v.currentTime -= <span class=\"hljs-number\">5<\/span>;\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-keyword\">break<\/span>;\n\u00a0 \u00a0 <span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'+'<\/span>:\n\u00a0 \u00a0 \u00a0 v.playbackRate = <span class=\"hljs-built_in\">Math<\/span>.min(<span class=\"hljs-number\">2<\/span>, v.playbackRate + <span class=\"hljs-number\">0.25<\/span>);\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-keyword\">break<\/span>;\n\u00a0 \u00a0 <span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'-'<\/span>:\n\u00a0 \u00a0 \u00a0 v.playbackRate = <span class=\"hljs-built_in\">Math<\/span>.max(<span class=\"hljs-number\">0.5<\/span>, v.playbackRate - <span class=\"hljs-number\">0.25<\/span>);\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-keyword\">break<\/span>;\n\u00a0 }\n});<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Formats and delivery tips<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Offer at least MP4 H.264 and WebM for broad coverage.<\/li>\n\n\n\n<li>Encode efficiently for faster starts and lower battery usage. Review <a href=\"https:\/\/cloudinary.com\/guides\/web-performance\/video-encoding-how-it-works-formats-best-practices\">video encoding best practices<\/a>.<\/li>\n\n\n\n<li>Provide multiple resolutions or adaptive bitrate so users can pick or auto-negotiate quality. Learn about the trade-offs in <a href=\"https:\/\/cloudinary.com\/guides\/video\/bitrate-vs-resolution\">bitrate vs resolution<\/a>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Captions and VTT quick primer<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">WEBVTT<\/span>\n\n00<span class=\"hljs-selector-pseudo\">:00<\/span><span class=\"hljs-selector-pseudo\">:00.000<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; 00<span class=\"hljs-selector-pseudo\">:00<\/span><span class=\"hljs-selector-pseudo\">:02.500<\/span>\n<span class=\"hljs-selector-tag\">Intro<\/span> <span class=\"hljs-selector-tag\">music<\/span> <span class=\"hljs-selector-tag\">and<\/span> <span class=\"hljs-selector-tag\">title<\/span> <span class=\"hljs-selector-tag\">animation<\/span>\n\n00<span class=\"hljs-selector-pseudo\">:00<\/span><span class=\"hljs-selector-pseudo\">:02.500<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; 00<span class=\"hljs-selector-pseudo\">:00<\/span><span class=\"hljs-selector-pseudo\">:06.000<\/span>\n<span class=\"hljs-selector-tag\">Narrator<\/span>: <span class=\"hljs-selector-tag\">Welcome<\/span> <span class=\"hljs-selector-tag\">to<\/span> <span class=\"hljs-selector-tag\">the<\/span> <span class=\"hljs-selector-tag\">product<\/span> <span class=\"hljs-selector-tag\">tour<\/span>.<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Keep captions synchronized, concise, and include speaker IDs and non-speech audio when relevant.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Enhancing the workflow with Cloudinary<\/h2>\n\n\n\n<p>After you have captions and transcripts in place, you can host and deliver accessible variants efficiently. For example, upload your video and VTT files, then reference them from your HTML with multiple formats and a poster image.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">video<\/span> <span class=\"hljs-attr\">controls<\/span> <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">\"800\"<\/span>\n\u00a0 <span class=\"hljs-attr\">aria-label<\/span>=<span class=\"hljs-string\">\"Product demo video\"<\/span>\n\u00a0 <span class=\"hljs-attr\">poster<\/span>=<span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/w_800,c_fill,q_auto\/product-demo-poster.jpg\"<\/span>&gt;<\/span>\n\u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">source<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/demo\/video\/upload\/f_mp4,q_auto\/vproduct-demo\"<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"video\/mp4\"<\/span>&gt;<\/span>\n\u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">source<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/demo\/video\/upload\/f_webm,q_auto\/vproduct-demo\"<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"video\/webm\"<\/span>&gt;<\/span>\n\u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">track<\/span> <span class=\"hljs-attr\">kind<\/span>=<span class=\"hljs-string\">\"captions\"<\/span>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/demo\/raw\/upload\/product-demo.en.vtt\"<\/span>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">srclang<\/span>=<span class=\"hljs-string\">\"en\"<\/span> <span class=\"hljs-attr\">label<\/span>=<span class=\"hljs-string\">\"English\"<\/span> <span class=\"hljs-attr\">default<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">video<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Alternatively, you can also use Cloudinary to <a href=\"https:\/\/cloudinary.com\/blog\/ai-auto-captions-composable-website-video-next-js\">add auto-captions<\/a> to your videos dynamically, and at scale.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testing checklist<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Keyboard only: <\/strong>Can you operate play, pause, seek, volume, and speed without a mouse.<\/li>\n\n\n\n<li><strong>Screen reader: <\/strong>Verify labels, focus order, and that captions communicate non-speech audio.<\/li>\n\n\n\n<li><strong>Low bandwidth: <\/strong>Confirm the player starts quickly and quality can adjust.<\/li>\n\n\n\n<li><strong>No motion preference:<\/strong> Avoid aggressive auto-play animations by default.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">TL;DR<\/h2>\n\n\n\n<p>Provide captions, transcripts, and audio descriptions. Make controls keyboard friendly and visible, avoid auto-play with audio, and ship multiple formats and qualities. Use a reliable CDN to deliver optimized video and VTT. If you are already managing media in the cloud, you can host videos and caption files together and reference them directly in your HTML.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Learn More<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/cloudinary.com\/guides\/video\/video-as-a-service\">Video as a Service<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/guides\/video\/video-engineering\">Video Engineering<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/tools\/mov-to-mp4\">MOV to MP4<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/tools\/webm-converter\">WebM Converter<\/a><\/li>\n<\/ul>\n\n\n\n<p>Ready to optimize accessible video at scale and deliver fast across devices? <a href=\"https:\/\/cloudinary.com\/users\/register_free\">Create a free Cloudinary account<\/a> and streamline your video pipeline.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A common thread in dev communities right now: teams ship great video content, then realize some users cannot access it without captions, transcripts, keyboard controls, or audio descriptions. Accessibility is not just compliance, it is usability and reach. Question: Hi folks, I am updating our video player and need practical guidance on accessibility. Specifically: How [&hellip;]<\/p>\n","protected":false},"author":88,"featured_media":39255,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[423],"class_list":["post-39254","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-questions"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>How to make videos accessible (WCAG)?<\/title>\n<meta name=\"description\" content=\"A common thread in dev communities right now: teams ship great video content, then realize some users cannot access it without captions, transcripts,\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to make videos accessible (WCAG)?\" \/>\n<meta property=\"og:description\" content=\"A common thread in dev communities right now: teams ship great video content, then realize some users cannot access it without captions, transcripts,\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-10T22:49:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-10T22:50:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814968\/how_to_make_videos_accessible_wcag_featured_image\/how_to_make_videos_accessible_wcag_featured_image.jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1999\" \/>\n\t<meta property=\"og:image:height\" content=\"1100\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"damjanantevski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/\"},\"author\":{\"name\":\"damjanantevski\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e\"},\"headline\":\"How to make videos accessible (WCAG)?\",\"datePublished\":\"2025-11-10T22:49:47+00:00\",\"dateModified\":\"2025-11-10T22:50:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/\"},\"wordCount\":500,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814968\/how_to_make_videos_accessible_wcag_featured_image\/how_to_make_videos_accessible_wcag_featured_image.jpg?_i=AA\",\"keywords\":[\"Questions\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/\",\"url\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/\",\"name\":\"How to make videos accessible (WCAG)?\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814968\/how_to_make_videos_accessible_wcag_featured_image\/how_to_make_videos_accessible_wcag_featured_image.jpg?_i=AA\",\"datePublished\":\"2025-11-10T22:49:47+00:00\",\"dateModified\":\"2025-11-10T22:50:09+00:00\",\"description\":\"A common thread in dev communities right now: teams ship great video content, then realize some users cannot access it without captions, transcripts,\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814968\/how_to_make_videos_accessible_wcag_featured_image\/how_to_make_videos_accessible_wcag_featured_image.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814968\/how_to_make_videos_accessible_wcag_featured_image\/how_to_make_videos_accessible_wcag_featured_image.jpg?_i=AA\",\"width\":1999,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to make videos accessible (WCAG)?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e\",\"name\":\"damjanantevski\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3b40c995531fe4d510212a06c9d4fc666d2cb8efbfebc98a94191701accf4817?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3b40c995531fe4d510212a06c9d4fc666d2cb8efbfebc98a94191701accf4817?s=96&d=mm&r=g\",\"caption\":\"damjanantevski\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How to make videos accessible (WCAG)?","description":"A common thread in dev communities right now: teams ship great video content, then realize some users cannot access it without captions, transcripts,","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/","og_locale":"en_US","og_type":"article","og_title":"How to make videos accessible (WCAG)?","og_description":"A common thread in dev communities right now: teams ship great video content, then realize some users cannot access it without captions, transcripts,","og_url":"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/","og_site_name":"Cloudinary Blog","article_published_time":"2025-11-10T22:49:47+00:00","article_modified_time":"2025-11-10T22:50:09+00:00","og_image":[{"width":1999,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814968\/how_to_make_videos_accessible_wcag_featured_image\/how_to_make_videos_accessible_wcag_featured_image.jpg?_i=AA","type":"image\/jpeg"}],"author":"damjanantevski","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/"},"author":{"name":"damjanantevski","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e"},"headline":"How to make videos accessible (WCAG)?","datePublished":"2025-11-10T22:49:47+00:00","dateModified":"2025-11-10T22:50:09+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/"},"wordCount":500,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814968\/how_to_make_videos_accessible_wcag_featured_image\/how_to_make_videos_accessible_wcag_featured_image.jpg?_i=AA","keywords":["Questions"],"inLanguage":"en-US","copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/","url":"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/","name":"How to make videos accessible (WCAG)?","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814968\/how_to_make_videos_accessible_wcag_featured_image\/how_to_make_videos_accessible_wcag_featured_image.jpg?_i=AA","datePublished":"2025-11-10T22:49:47+00:00","dateModified":"2025-11-10T22:50:09+00:00","description":"A common thread in dev communities right now: teams ship great video content, then realize some users cannot access it without captions, transcripts,","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814968\/how_to_make_videos_accessible_wcag_featured_image\/how_to_make_videos_accessible_wcag_featured_image.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814968\/how_to_make_videos_accessible_wcag_featured_image\/how_to_make_videos_accessible_wcag_featured_image.jpg?_i=AA","width":1999,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-make-videos-accessible-wcag\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to make videos accessible (WCAG)?"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e","name":"damjanantevski","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/3b40c995531fe4d510212a06c9d4fc666d2cb8efbfebc98a94191701accf4817?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3b40c995531fe4d510212a06c9d4fc666d2cb8efbfebc98a94191701accf4817?s=96&d=mm&r=g","caption":"damjanantevski"}}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1762814968\/how_to_make_videos_accessible_wcag_featured_image\/how_to_make_videos_accessible_wcag_featured_image.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/39254","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/88"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=39254"}],"version-history":[{"count":2,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/39254\/revisions"}],"predecessor-version":[{"id":39257,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/39254\/revisions\/39257"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/39255"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=39254"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=39254"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=39254"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}