{"id":1125,"date":"2026-06-10T09:43:25","date_gmt":"2026-06-10T02:43:25","guid":{"rendered":"https:\/\/liveapi.com\/blog\/how-to-add-closed-captioning-to-a-video\/"},"modified":"2026-06-10T09:43:53","modified_gmt":"2026-06-10T02:43:53","slug":"how-to-add-closed-captioning-to-a-video","status":"publish","type":"post","link":"https:\/\/liveapi.com\/blog\/how-to-add-closed-captioning-to-a-video\/","title":{"rendered":"How to Add Closed Captioning to a Video: Methods, Formats, and Code"},"content":{"rendered":"<span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\">10<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><p>Roughly 85% of videos on social platforms are watched with the sound off, and about 1 in 5 people experience some degree of hearing loss. Captions cover both groups at once \u2014 they make your content readable on a muted phone in a noisy room and accessible to viewers who are deaf or hard of hearing. They also give search engines text to index, which helps your videos rank.<\/p>\n<p>This guide shows you how to add closed captioning to a video three ways: by hand, with automatic speech recognition, and through an API for apps that serve video at scale. You&#8217;ll see the caption file formats that matter, the exact steps for popular platforms, and the code needed to attach captions to an <a href=\"https:\/\/liveapi.com\/blog\/what-is-hls-streaming\/\" target=\"_blank\">HLS<\/a> stream so they play correctly across devices.<\/p>\n<h2>What Is Closed Captioning?<\/h2>\n<p>Closed captioning is a text version of the spoken audio and relevant sounds in a video that viewers can turn on or off. The word &#8220;closed&#8221; means the captions live in a separate track or file and stay hidden until the viewer enables them \u2014 unlike open captions, which are burned into the video frames and always visible.<\/p>\n<p>Closed captions include more than dialogue. A proper caption track also describes speaker changes, music cues, and sound effects like [APPLAUSE] or [DOOR SLAMS], because the viewer may not hear them at all. That distinction matters for accessibility compliance and for the experience of deaf and hard-of-hearing audiences.<\/p>\n<h3>Closed Captions vs Subtitles vs Open Captions<\/h3>\n<p>People use these terms interchangeably, but they describe different things. The table below breaks down the differences.<\/p>\n<table>\n<thead>\n<tr>\n<th>Type<\/th>\n<th>Toggle on\/off?<\/th>\n<th>Includes sound effects?<\/th>\n<th>Primary purpose<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Closed captions<\/td>\n<td>Yes<\/td>\n<td>Yes<\/td>\n<td>Accessibility for deaf\/hard-of-hearing viewers<\/td>\n<\/tr>\n<tr>\n<td>Open captions<\/td>\n<td>No (burned in)<\/td>\n<td>Yes<\/td>\n<td>Guaranteed display where toggling isn&#8217;t supported<\/td>\n<\/tr>\n<tr>\n<td>Subtitles<\/td>\n<td>Yes<\/td>\n<td>No (dialogue only)<\/td>\n<td>Translation for viewers who can hear but don&#8217;t speak the language<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>In short: captions assume the viewer can&#8217;t hear the audio, while subtitles assume they can hear but need a translation. Apple labels accessibility-focused tracks &#8220;SDH&#8221; (Subtitles for the Deaf and Hard of hearing). If you want a deeper breakdown, see our guide on <a href=\"https:\/\/liveapi.com\/blog\/closed-captioning-vs-subtitles\/\" target=\"_blank\">closed captioning vs subtitles<\/a>.<\/p>\n<h2>Caption File Formats You Need to Know<\/h2>\n<p>Before you add closed captioning to a video, you need the captions in a file format your player or platform accepts. Four formats cover almost every workflow.<\/p>\n<table>\n<thead>\n<tr>\n<th>Format<\/th>\n<th>Extension<\/th>\n<th>Styling support<\/th>\n<th>Best for<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>SubRip<\/td>\n<td><code>.srt<\/code><\/td>\n<td>Minimal<\/td>\n<td>Uploads to YouTube, Facebook, LinkedIn<\/td>\n<\/tr>\n<tr>\n<td>WebVTT<\/td>\n<td><code>.vtt<\/code><\/td>\n<td>Positioning, color, fonts<\/td>\n<td>HTML5 video and HLS streaming<\/td>\n<\/tr>\n<tr>\n<td>TTML \/ IMSC<\/td>\n<td><code>.ttml<\/code>, <code>.xml<\/code><\/td>\n<td>Rich layout<\/td>\n<td>Broadcast and DASH workflows<\/td>\n<\/tr>\n<tr>\n<td>CEA-608\/708<\/td>\n<td>Embedded<\/td>\n<td>Limited (608), rich (708)<\/td>\n<td>Broadcast TV and in-band streams<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>SRT<\/strong> is the most widely accepted upload format. It&#8217;s plain text with sequential numbers, start\/end timecodes, and the caption line. Most social and hosting platforms accept it directly.<\/p>\n<p><strong>WebVTT<\/strong> (Web Video Text Tracks) is the format for the modern web. It&#8217;s the only caption format the HTML5 <code>&lt;track&gt;<\/code> element supports natively, and it&#8217;s the standard for captions delivered inside HLS streams. WebVTT files must be UTF-8 encoded and start with a <code>WEBVTT<\/code> header line. Our <a href=\"https:\/\/liveapi.com\/blog\/vtt-vs-srt\/\" target=\"_blank\">VTT vs SRT comparison<\/a> covers when to pick one over the other.<\/p>\n<p><strong>CEA-608 and CEA-708<\/strong> are the legacy broadcast standards, embedded directly in the video signal rather than carried as a sidecar file. You&#8217;ll mostly encounter them when ingesting broadcast feeds or converting them to WebVTT for web delivery.<\/p>\n<p>Here&#8217;s what a minimal WebVTT file looks like:<\/p>\n<pre><code>WEBVTT\n\n00:00:01.000 --&gt; 00:00:04.000\nWelcome to the live stream.\n\n00:00:04.500 --&gt; 00:00:07.200\n[upbeat music]\n\n00:00:07.500 --&gt; 00:00:10.000\nToday we're shipping captions.\n<\/code><\/pre>\n<p>The SRT equivalent is nearly identical, but uses comma decimal separators and numbered cues:<\/p>\n<pre><code>1\n00:00:01,000 --&gt; 00:00:04,000\nWelcome to the live stream.\n\n2\n00:00:04,500 --&gt; 00:00:07,200\n[upbeat music]\n<\/code><\/pre>\n<h2>Three Ways to Add Closed Captioning to a Video<\/h2>\n<p>There are three practical methods, and the right one depends on how many videos you handle and where they&#8217;re delivered.<\/p>\n<table>\n<thead>\n<tr>\n<th>Method<\/th>\n<th>Speed<\/th>\n<th>Accuracy<\/th>\n<th>Best for<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Manual<\/td>\n<td>Slow<\/td>\n<td>Highest<\/td>\n<td>One-off videos, exact compliance<\/td>\n<\/tr>\n<tr>\n<td>Automatic (ASR)<\/td>\n<td>Fast<\/td>\n<td>85\u201395%<\/td>\n<td>Bulk libraries, social clips<\/td>\n<\/tr>\n<tr>\n<td>API \/ programmatic<\/td>\n<td>Fast at scale<\/td>\n<td>Depends on source<\/td>\n<td>Apps and streaming platforms<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The next three sections walk through each in order.<\/p>\n<h2>How to Add Closed Captioning to a Video Manually<\/h2>\n<p>Manual captioning gives you the most accurate result because a human writes and times every line. The trade-off is time \u2014 expect roughly 4 to 6 minutes of work per minute of video. Here are the steps.<\/p>\n<ol>\n<li><strong>Transcribe the audio.<\/strong> Play the video and type out every spoken line, plus sound effects and speaker labels. Keep each caption to one or two lines so it fits on screen.<\/li>\n<li><strong>Add timecodes.<\/strong> Note the start and end time for each caption in <code>HH:MM:SS,mmm<\/code> format. Captions should appear as the words are spoken and stay on screen long enough to read \u2014 usually 1 to 6 seconds.<\/li>\n<li><strong>Save as an SRT or VTT file.<\/strong> Use a plain-text editor \u2014 TextEdit on Mac (in plain-text mode) or Notepad on Windows. Save with the <code>.srt<\/code> or <code>.vtt<\/code> extension and UTF-8 encoding.<\/li>\n<li><strong>Upload the file alongside your video.<\/strong> Most platforms have a &#8220;subtitles\/CC&#8221; option where you attach the file. The platform syncs it to the video using the timecodes.<\/li>\n<\/ol>\n<p>This approach works well for a handful of videos where accuracy is non-negotiable, such as legal, medical, or training content.<\/p>\n<h2>How to Add Closed Captions Automatically<\/h2>\n<p>Automatic speech recognition (ASR) generates a caption track from the audio in minutes. Modern engines hit 85\u201395% accuracy on clear audio, which is good enough for a first draft you then correct.<\/p>\n<p>The workflow is consistent across tools:<\/p>\n<ol>\n<li>Upload the video to a captioning service or platform with built-in ASR.<\/li>\n<li>The engine transcribes the audio and generates timed captions.<\/li>\n<li>Review and edit the output \u2014 fix names, technical terms, and any spots where multiple people talk at once.<\/li>\n<li>Publish the corrected track or export it as an SRT\/VTT file.<\/li>\n<\/ol>\n<p>Cloud speech APIs power most of these tools under the hood. Google Cloud Speech-to-Text, AWS Transcribe, and Azure Speech all return word-level timestamps you can convert into WebVTT cues. If you&#8217;re building this into your own product, you&#8217;d extract the audio with a tool like FFmpeg, send it to the speech API, and format the response as a caption file.<\/p>\n<p>Always review automatic captions before publishing. ASR struggles with proper nouns, accents, overlapping speakers, and background noise \u2014 exactly the details that matter for accessibility.<\/p>\n<h2>How to Add Captions on Popular Platforms<\/h2>\n<p>If you&#8217;re publishing to a hosted platform rather than your own app, each one has its own caption upload flow. Here are the most common.<\/p>\n<ul>\n<li><strong>YouTube:<\/strong> In YouTube Studio, open <strong>Subtitles<\/strong> from the left menu, pick a language, then choose <strong>Upload file<\/strong> to add an SRT, or type captions manually. YouTube can also auto-generate a draft you edit. Note that YouTube&#8217;s caption auto-sync was changed in 2024, so uploading a properly timed file is the reliable path.<\/li>\n<li><strong>Vimeo:<\/strong> Open a video&#8217;s settings, go to the <strong>Advanced<\/strong> or <strong>Distribution<\/strong> tab, find <strong>Subtitles<\/strong>, and upload an SRT or VTT file per language.<\/li>\n<li><strong>Facebook &amp; LinkedIn:<\/strong> Both accept SRT files on upload. Facebook requires a specific filename format that includes the language locale (for example, <code>video.en_US.srt<\/code>).<\/li>\n<li><strong>Zoom &amp; video conferencing:<\/strong> Live closed captioning is enabled in account settings, then turned on during a meeting, either through automatic captions or a captioner typing in real time.<\/li>\n<\/ul>\n<p>These flows are fine for marketing clips and webinars. But if you&#8217;re building a product that hosts or streams video \u2014 an OTT service, a course platform, or a social app \u2014 you need captions to work programmatically across thousands of videos. That&#8217;s where an API approach takes over.<\/p>\n<h2>How to Add Closed Captioning to a Video via API<\/h2>\n<p>For developers, manual uploads don&#8217;t scale. When your application ingests user uploads or runs live events, you want captions attached through code as part of your pipeline. A <a href=\"https:\/\/liveapi.com\/blog\/video-api-developer-guide\/\" target=\"_blank\">video API<\/a> handles this by accepting a caption file and associating it with a video asset.<\/p>\n<p>The general pattern across video platforms looks like this:<\/p>\n<ol>\n<li><strong>Authenticate<\/strong> and get an access token.<\/li>\n<li><strong>Identify the video asset<\/strong> you want to caption by its ID.<\/li>\n<li><strong>Upload the caption file<\/strong> (usually WebVTT) and tag it with a language code.<\/li>\n<li><strong>Optionally set a default<\/strong> track so captions appear automatically.<\/li>\n<\/ol>\n<p>A typical caption upload request looks like this:<\/p>\n<pre><code class=\"language-bash\">curl -X POST &quot;https:\/\/api.example.com\/videos\/VIDEO_ID\/captions\/en&quot; \\\n  -H &quot;Authorization: Bearer ACCESS_TOKEN&quot; \\\n  -F &quot;file=@captions-en.vtt&quot;\n<\/code><\/pre>\n<p>You can repeat the call for each language, attaching <code>fr<\/code>, <code>es<\/code>, or <code>de<\/code> tracks to the same asset. The player then exposes a caption menu so viewers choose their language.<\/p>\n<p>When you build on a platform like LiveAPI, captions ride along with the same <a href=\"https:\/\/liveapi.com\/blog\/video-hosting-api\/\" target=\"_blank\">video hosting API<\/a> and <a href=\"https:\/\/liveapi.com\/blog\/video-player-api\/\" target=\"_blank\">embeddable player<\/a> you already use for playback. Because the platform handles <a href=\"https:\/\/liveapi.com\/blog\/what-is-video-encoding\/\" target=\"_blank\">video encoding<\/a> and HLS packaging for you, your WebVTT track is delivered through the same global CDN as the video segments \u2014 no separate hosting or sync setup required. That matters when you&#8217;re shipping a streaming feature fast rather than building caption infrastructure from scratch.<\/p>\n<h3>Adding Captions in HTML5 Video<\/h3>\n<p>If you&#8217;re serving a single progressive MP4 in the browser, the HTML5 <code>&lt;track&gt;<\/code> element is the simplest path. Point it at a WebVTT file:<\/p>\n<pre><code class=\"language-html\">&lt;video controls&gt;\n  &lt;source src=&quot;lecture.mp4&quot; type=&quot;video\/mp4&quot; \/&gt;\n  &lt;track\n    src=&quot;captions-en.vtt&quot;\n    kind=&quot;captions&quot;\n    srclang=&quot;en&quot;\n    label=&quot;English&quot;\n    default\n  \/&gt;\n&lt;\/video&gt;\n<\/code><\/pre>\n<p>The <code>kind=\"captions\"<\/code> attribute tells the browser this track is for accessibility (versus <code>kind=\"subtitles\"<\/code> for translation), and <code>default<\/code> turns it on automatically. This works for short clips, but for adaptive streaming you need captions inside the HLS manifest.<\/p>\n<h2>How to Add Closed Captions to an HLS Stream<\/h2>\n<p>Most production video uses <a href=\"https:\/\/liveapi.com\/blog\/adaptive-bitrate-streaming\/\" target=\"_blank\">adaptive bitrate streaming<\/a> over HLS so playback adjusts to each viewer&#8217;s connection. Captions in HLS are delivered &#8220;out of band&#8221; \u2014 as a separate WebVTT playlist referenced from the master manifest \u2014 so they can be toggled independently of the video.<\/p>\n<p>You declare a subtitle track in the master <code>.m3u8<\/code> playlist with an <code>EXT-X-MEDIA<\/code> tag:<\/p>\n<pre><code>#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID=&quot;subs&quot;,NAME=&quot;English&quot;,\\\nLANGUAGE=&quot;en-US&quot;,AUTOSELECT=YES,DEFAULT=NO,FORCED=NO,\\\nCHARACTERISTICS=&quot;public.accessibility.transcribes-spoken-dialog&quot;,\\\nURI=&quot;subtitles\/en\/playlist.m3u8&quot;\n<\/code><\/pre>\n<p>Then each video variant references that subtitle group:<\/p>\n<pre><code>#EXT-X-STREAM-INF:BANDWIDTH=2000000,SUBTITLES=&quot;subs&quot;\nvideo\/720p\/playlist.m3u8\n<\/code><\/pre>\n<p>Three flags control caption behavior, and getting them right prevents the most common bugs:<\/p>\n<ul>\n<li><strong>AUTOSELECT=YES<\/strong> \u2014 the player may pick this track automatically based on the viewer&#8217;s system language or accessibility settings.<\/li>\n<li><strong>DEFAULT=NO<\/strong> \u2014 the track does not play unless the viewer (or AUTOSELECT) chooses it. Set only one track to <code>DEFAULT=YES<\/code> per group.<\/li>\n<li><strong>FORCED=NO<\/strong> \u2014 reserve <code>YES<\/code> for captions that must always show, like translating on-screen foreign dialogue.<\/li>\n<\/ul>\n<p>One detail trips up most developers: HLS expects the WebVTT to be <strong>segmented<\/strong> to match your video segments. If your media segments are 6 seconds, your subtitle playlist should reference 6-second WebVTT chunks so captions stay in sync as the player buffers. A managed <a href=\"https:\/\/liveapi.com\/blog\/live-streaming-api\/\" target=\"_blank\">live streaming API<\/a> handles this segmentation automatically when you supply a caption file, which removes the trickiest part of the job.<\/p>\n<h2>How to Add Live Closed Captioning<\/h2>\n<p>Live closed captioning adds text to a stream in real time, which is required for live events in many jurisdictions. There are two approaches.<\/p>\n<p><strong>Human captioners<\/strong> (also called CART) type or re-speak the audio into captioning software that injects CEA-608\/708 data or pushes WebVTT cues into the live manifest. This delivers the highest accuracy and is common for broadcast and regulated events.<\/p>\n<p><strong>Automatic live captions<\/strong> route the stream&#8217;s audio through a real-time speech API that returns text with a short delay \u2014 typically 2 to 5 seconds behind the audio. Accuracy is lower than human captioning but the cost is a fraction.<\/p>\n<p>For app builders, the practical setup is to capture the audio from your <a href=\"https:\/\/liveapi.com\/blog\/what-is-rtmp\/\" target=\"_blank\">RTMP or SRT ingest<\/a>, send it to a streaming speech-to-text service, format the results as timed WebVTT cues, and push them into the live HLS playlist. Because captions and the recording flow through the same pipeline, <a href=\"https:\/\/liveapi.com\/blog\/how-to-stream-live-video\/\" target=\"_blank\">live-to-VOD<\/a> recordings keep the captions automatically when the event ends.<\/p>\n<h2>Best Practices for Accessible Captions<\/h2>\n<p>Adding a caption track is step one. These practices make captions genuinely useful and keep you compliant.<\/p>\n<ul>\n<li><strong>Match reading speed to comprehension.<\/strong> Keep captions to about 32 characters per line and 1 to 2 lines at a time. Display each cue for at least 1 second.<\/li>\n<li><strong>Identify speakers and sounds.<\/strong> Use labels like <code>&gt;&gt; JOHN:<\/code> for speaker changes and brackets for non-speech audio: <code>[phone rings]<\/code>.<\/li>\n<li><strong>Sync tightly.<\/strong> Captions should appear within a fraction of a second of the spoken words. Drift over a long video is the most common complaint.<\/li>\n<li><strong>Use WebVTT for the web.<\/strong> It&#8217;s the format with the broadest player and HLS support and it allows positioning so captions don&#8217;t cover on-screen text.<\/li>\n<li><strong>Provide multiple languages where it helps.<\/strong> Attach separate tracks per language rather than burning one language into the frames.<\/li>\n<li><strong>Meet the standards that apply to you.<\/strong> In the US, the <a href=\"https:\/\/www.fcc.gov\/consumers\/guides\/closed-captioning-television\" target=\"_blank\" rel=\"nofollow\">FCC closed captioning rules<\/a> govern TV and much online content, and the <a href=\"https:\/\/www.w3.org\/WAI\/standards-guidelines\/wcag\/\" target=\"_blank\" rel=\"nofollow\">WCAG guidelines<\/a> set the accessibility bar for the web.<\/li>\n<\/ul>\n<p>Following these makes captions readable for everyone and reduces the risk of accessibility complaints. They also improve <a href=\"https:\/\/liveapi.com\/blog\/video-sitemap\/\" target=\"_blank\">video SEO<\/a>, since search engines read the caption text to understand and rank your content.<\/p>\n<h2>Is an API Approach Right for Your Project?<\/h2>\n<p>Use this quick checklist to decide whether to handle captions manually or through a video API:<\/p>\n<ul>\n<li><strong>You publish more than a few videos a month<\/strong> \u2192 an API removes the per-video upload work.<\/li>\n<li><strong>You run live events<\/strong> \u2192 you need programmatic live caption injection into the HLS manifest.<\/li>\n<li><strong>You serve a global audience<\/strong> \u2192 you&#8217;ll attach multiple language tracks per asset.<\/li>\n<li><strong>You&#8217;re building an app, not posting to a platform<\/strong> \u2192 you need captions delivered through your own player and CDN.<\/li>\n<\/ul>\n<p>If two or more of these apply, building captions into your <a href=\"https:\/\/liveapi.com\/blog\/how-to-build-a-video-streaming-app\/\" target=\"_blank\">video streaming app<\/a> through an API will save far more time than manual uploads ever could.<\/p>\n<h2>How to Add Closed Captioning to a Video: FAQ<\/h2>\n<h3>What&#8217;s the difference between closed captions and subtitles?<\/h3>\n<p>Closed captions assume the viewer can&#8217;t hear the audio, so they include sound effects and speaker labels along with dialogue. Subtitles assume the viewer can hear but needs a translation, so they only carry dialogue. Both can be toggled on and off.<\/p>\n<h3>What file format should I use for captions?<\/h3>\n<p>Use SRT for uploads to platforms like YouTube, Facebook, and LinkedIn. Use WebVTT (<code>.vtt<\/code>) for HTML5 video and for captions inside HLS streams, since it&#8217;s the format with the broadest web and player support.<\/p>\n<h3>How do I add closed captioning to a video automatically?<\/h3>\n<p>Upload the video to a tool or platform with automatic speech recognition, let it generate a timed caption track, then review and correct the text before publishing. Cloud APIs like Google Speech-to-Text, AWS Transcribe, and Azure Speech power most of these tools.<\/p>\n<h3>Why is it called &#8220;closed&#8221; captioning?<\/h3>\n<p>&#8220;Closed&#8221; means the captions are stored separately from the video and stay hidden until the viewer turns them on. &#8220;Open&#8221; captions are burned into the video frames and can&#8217;t be turned off.<\/p>\n<h3>Can I add captions to a live stream?<\/h3>\n<p>Yes. Live closed captioning works either through a human captioner typing in real time or through an automatic speech-to-text service that injects WebVTT cues into the live HLS manifest with a few seconds of delay.<\/p>\n<h3>Do captions help with SEO?<\/h3>\n<p>Yes. Search engines can&#8217;t watch a video, but they can read its caption text. A caption track gives crawlers indexable content about the video, which can improve how it ranks and surfaces in search.<\/p>\n<h3>How accurate is automatic captioning?<\/h3>\n<p>Automatic speech recognition reaches roughly 85\u201395% accuracy on clear audio with a single speaker. Accuracy drops with accents, background noise, overlapping speakers, and technical jargon, so always review auto-generated captions before publishing.<\/p>\n<h3>Will captions stay synced if the video uses adaptive bitrate?<\/h3>\n<p>They will if the WebVTT track is segmented to match your video segments. HLS expects subtitle segments aligned to the media segments (for example, 6-second chunks), which a managed streaming platform handles automatically when you supply the caption file.<\/p>\n<h2>Add Captions to Your Video Without Building the Pipeline<\/h2>\n<p>Adding closed captioning to a video comes down to three choices: write captions by hand for maximum accuracy, generate them automatically with speech recognition, or attach them through an API when you&#8217;re serving video at scale. For apps and streaming products, the API route wins \u2014 it delivers WebVTT through the same HLS pipeline as your video, segments captions to stay in sync, and carries them into your live-to-VOD recordings without extra work.<\/p>\n<p>LiveAPI gives you live streaming, <a href=\"https:\/\/liveapi.com\/blog\/video-on-demand-platforms\/\" target=\"_blank\">video hosting<\/a>, encoding, and an embeddable player through one developer-friendly API, so captions ship as part of the same delivery you already use. <a href=\"https:\/\/liveapi.com\/\" target=\"_blank\">Get started with LiveAPI<\/a> and add accessible, searchable captions to your videos in days, not months.<\/p>\n","protected":false},"excerpt":{"rendered":"<p><span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\">10<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span> Roughly 85% of videos on social platforms are watched with the sound off, and about 1 in 5 people experience some degree of hearing loss. Captions cover both groups at once \u2014 they make your content readable on a muted phone in a noisy room and accessible to viewers who are deaf or hard of [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1126,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_yoast_wpseo_title":"How to Add Closed Captioning to a Video (Dev Guide) %%sep%% %%sitename%%","_yoast_wpseo_metadesc":"Learn how to add closed captioning to a video manually, automatically, and via API \u2014 including SRT, WebVTT, and embedding captions in HLS streams.","inline_featured_image":false,"footnotes":""},"categories":[36],"tags":[],"class_list":["post-1125","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-captions"],"jetpack_featured_media_url":"https:\/\/liveapi.com\/blog\/wp-content\/uploads\/2026\/06\/how-to-add-closed-captioning-to-a-video.jpg","yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v15.6.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<meta name=\"description\" content=\"Learn how to add closed captioning to a video manually, automatically, and via API \u2014 including SRT, WebVTT, and embedding captions in HLS streams.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/liveapi.com\/blog\/how-to-add-closed-captioning-to-a-video\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Add Closed Captioning to a Video (Dev Guide) - LiveAPI Blog\" \/>\n<meta property=\"og:description\" content=\"Learn how to add closed captioning to a video manually, automatically, and via API \u2014 including SRT, WebVTT, and embedding captions in HLS streams.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/liveapi.com\/blog\/how-to-add-closed-captioning-to-a-video\/\" \/>\n<meta property=\"og:site_name\" content=\"LiveAPI Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-10T02:43:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-10T02:43:53+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\">\n\t<meta name=\"twitter:data1\" content=\"14 minutes\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/liveapi.com\/blog\/#website\",\"url\":\"https:\/\/liveapi.com\/blog\/\",\"name\":\"LiveAPI Blog\",\"description\":\"Live Video Streaming API Blog\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/liveapi.com\/blog\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/liveapi.com\/blog\/how-to-add-closed-captioning-to-a-video\/#primaryimage\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/liveapi.com\/blog\/wp-content\/uploads\/2026\/06\/how-to-add-closed-captioning-to-a-video.jpg\",\"width\":1880,\"height\":1253,\"caption\":\"Photo by Abdulkadir Emiro\\u011flu on Pexels\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/liveapi.com\/blog\/how-to-add-closed-captioning-to-a-video\/#webpage\",\"url\":\"https:\/\/liveapi.com\/blog\/how-to-add-closed-captioning-to-a-video\/\",\"name\":\"How to Add Closed Captioning to a Video (Dev Guide) - LiveAPI Blog\",\"isPartOf\":{\"@id\":\"https:\/\/liveapi.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/liveapi.com\/blog\/how-to-add-closed-captioning-to-a-video\/#primaryimage\"},\"datePublished\":\"2026-06-10T02:43:25+00:00\",\"dateModified\":\"2026-06-10T02:43:53+00:00\",\"author\":{\"@id\":\"https:\/\/liveapi.com\/blog\/#\/schema\/person\/98f2ee8b3a0bd93351c0d9e8ce490e4a\"},\"description\":\"Learn how to add closed captioning to a video manually, automatically, and via API \\u2014 including SRT, WebVTT, and embedding captions in HLS streams.\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/liveapi.com\/blog\/how-to-add-closed-captioning-to-a-video\/\"]}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/liveapi.com\/blog\/#\/schema\/person\/98f2ee8b3a0bd93351c0d9e8ce490e4a\",\"name\":\"govz\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/liveapi.com\/blog\/#personlogo\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ab5cbe0543c0a44dc944c720159323bd001fc39a8ba5b1f137cd22e7578e84c9?s=96&d=mm&r=g\",\"caption\":\"govz\"},\"sameAs\":[\"https:\/\/liveapi.com\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/posts\/1125","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/comments?post=1125"}],"version-history":[{"count":1,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/posts\/1125\/revisions"}],"predecessor-version":[{"id":1127,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/posts\/1125\/revisions\/1127"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/media\/1126"}],"wp:attachment":[{"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/media?parent=1125"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/categories?post=1125"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/tags?post=1125"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}