Burn SRT Subtitles Into a Video With Rendi

Turn a video and SRT file into a captioned MP4 with Rendi, covering API submission, completion checks, subtitle styling, and output review.

Friday, September 11, 2026Omid Saffari
Burn SRT Subtitles Into a Video With Rendi

Turn an approved video and a checked SRT file into a captioned MP4 without adding a video worker to your own infrastructure. Rendi accepts the regular FFmpeg subtitle filter as an API job, gives you a command ID, and returns a stored output after the render succeeds. The important boundary is simple: this burns existing captions into pixels. It does not transcribe speech or decide whether the words are correct.

The Short Answer

Burn the SRT when every viewer must see the same captions, regardless of what the player does with subtitle tracks. Keep the SRT separate when viewers need to switch captions off, change languages, or use player-level accessibility controls.

With Rendi, the working path is:

  1. Check the final video and SRT together.
  2. Put both files at URLs Rendi can fetch, or upload local files to Rendi first.
  3. Submit the documented FFmpeg subtitle command.
  4. Poll the command ID, or let a webhook receive the terminal result.
  5. Inspect the MP4 metadata and watch the full output before sending more jobs.

That sequence matters. A successful encoder can still produce a bad deliverable if a caption is early, a name is wrong, or the text sits under a platform's interface.

Architectural workflow showing VIDEO and SRT entering a POST stage, followed by SUCCESS and an MP4 output
Rendi turns two reviewed inputs into an asynchronous FFmpeg job, then exposes the finished MP4 after SUCCESS.

What Rendi Is Doing

Rendi is the machine room, not the editor. You send it the same FFmpeg instruction you would run locally, but over an HTTP API. Think of the request as a work order: the input aliases tell the machine where the materials are, the FFmpeg string tells it what operation to perform, and the output alias names the finished part.

The current request schema requires an ffmpeg_command and output_files. Input keys start with in_, output keys start with out_, and those names reappear inside the command between double braces. A successful submission returns a command_id, which is the claim ticket for the job.

For the simplest path, the video and SRT sit at public or time-limited signed HTTP URLs whose filenames appear at the end. A local path on your laptop is not an input URL. Rendi also has a multipart direct-upload flow for local files, with support for files up to 5 TB, but that is a separate preparation step.

Burned Captions and Selectable Tracks Are Different Outputs

Burned captions become part of every decoded frame. That makes their appearance predictable, but it also makes the decision permanent. A spelling correction means another video render, and viewers cannot hide the captions.

A selectable subtitle track remains separate from the picture. Rendi's own subtitle example recommends mov_text for a soft subtitle track in MP4 and omits the video filter. That preserves viewer control and avoids baking the text into the image.

Architectural comparison of burned captions embedded in a video slab and selectable captions stored as a separate track
Burned means ALWAYS ON. Selectable means CAN TOGGLE. Choose the delivery behavior before you render.

My rule is direct: use a burned review master or social delivery file when visual consistency is the requirement. Preserve the original SRT, and provide a selectable track or sidecar file wherever accessibility, search, translation, or viewer choice matters.

Check the SRT Before You Spend a Render

The cheapest render is the one you do not repeat. Review the SRT against the exact final cut, not an earlier export. Confirm the cue order, start and end times, spelling of names and numbers, intentional line breaks, and representative accented or non-Latin characters. Watch for captions that collide with lower-thirds or sit too close to the bottom edge.

Do not fold AI transcription into this step mentally. Speech recognition can draft an SRT upstream, but the file should reach this workflow only after a person or trusted review process has approved the words and timing. Rendi's job here is rendering.

Submit a Styled Rendi Job

This Node.js example uses Rendi's public sample video and sample SRT, so only RENDI_API_KEY is required to run it. The payload matches Rendi's live OpenAPI field names and alias rules. The force_style values create white text with a black outline and a bottom margin, while libx264 and AAC produce the MP4 described in Rendi's subtitle recipe.

JavaScript
const headers = {
  "X-API-KEY": process.env.RENDI_API_KEY,
  "Content-Type": "application/json",
};

const submit = await fetch("https://api.rendi.dev/v1/run-ffmpeg-command", {
  method: "POST",
  headers,
  body: JSON.stringify({
    input_files: {
      in_video: "https://storage.rendi.dev/sample/big_buck_bunny_720p_16sec.mp4",
      in_srt: "https://storage.rendi.dev/sample/subtitles.srt",
    },
    output_files: { out_1: "subtitled.mp4" },
    ffmpeg_command:
      "-i {{in_video}} -vf \"subtitles={{in_srt}}:force_style='FontSize=22,PrimaryColour=&H00FFFFFF,OutlineColour=&H00000000,BorderStyle=1,Outline=2,Shadow=0,MarginV=36'\" -c:v libx264 -crf 20 -c:a aac -b:a 192k {{out_1}}",
  }),
});

if (!submit.ok) throw new Error(await submit.text());
const { command_id } = await submit.json();

for (;;) {
  const poll = await fetch(
    `https://api.rendi.dev/v1/commands/${command_id}`,
    { headers: { "X-API-KEY": process.env.RENDI_API_KEY } },
  );
  const job = await poll.json();
  if (job.status === "SUCCESS") {
    console.log(job.output_files.out_1);
    break;
  }
  if (job.status === "FAILED") throw new Error(job.error_message);
  await new Promise((resolve) => setTimeout(resolve, 2000));
}

The subtitle filter changes the frames, so video re-encoding is required. You can tune style, codec, and quality, but treat every change as a new output that needs review. Rendi's official FFmpeg cheatsheet also documents custom fonts through fontsdir and FontName. Test the exact font and glyph set before using it across a library.

What Was Actually Tested

On 11 September 2026, the endpoint, request fields, alias rules, status values, and response fields above were checked against Rendi's live OpenAPI file. The exact subtitle filter was also run locally with FFmpeg 8.0.1 against Rendi's public sample video and SRT. It produced a 16-second, 1280 by 720 MP4 with H.264 video and AAC audio, and a frame at five seconds visibly contained the expected caption.

No Rendi cloud job was submitted because this environment did not contain a Rendi API key. The code is schema-checked and the FFmpeg operation is locally verified, but cloud execution is not being claimed.

Poll for Short Jobs, Use Webhooks for Longer Ones

Rendi's status endpoint can return QUEUED, PROCESSING, PREPARED_FFMPEG_COMMAND, FAILED, or SUCCESS. Do not treat an accepted POST as a finished video. Wait for a terminal state, surface error_message on failure, and read the output only after success.

Rendi recommends polling for jobs expected to finish in about 30 seconds or less and using a webhook for longer work. The webhook carries the same completed command data as polling. In production, make the completion handler idempotent, return quickly, and keep polling as a recovery path if webhook delivery eventually fails.

For sensitive outputs, set is_private: true on a paid plan and request a presigned URL when polling. Public storage is the default. A private file has no permanent public URL, and the requested download link can last no more than 7 days.

Inspect the Output Before You Batch

SUCCESS proves that FFmpeg finished. It does not prove that the captions are good. Check both the machine-readable response and the actual picture.

First, confirm that output_files.out_1 exists and that its storage_url opens. Compare the returned duration, dimensions, codec, and file format with the intended delivery. Then watch the entire video with special attention to the first cue, last cue, fastest exchange, line breaks, names, numbers, and captions near cuts or graphic overlays.

Only after that review should the same style preset enter a queue. Store the source-video revision, SRT revision, FFmpeg command, Rendi command ID, output file ID, and reviewer decision together. That record turns a pile of renders into a production system.

The Cost Math Is About Bytes, Not Minutes

Rendi counts the combined size of input and output media. Its pricing example treats a 1 GB input plus a 0.5 GB output as 1.5 GB of processing. Under that exact illustration, the Free plan's 50 GB allowance covers 33 complete jobs with 0.5 GB left, while the entry Pro plan's 250 GB covers 166 complete jobs with 1 GB left.

Architectural byte-budget equation showing 1 GB input plus 0.5 GB output equals 1.5 GB used, alongside Free 50 GB and Pro 250 GB allowances
Rendi meters the bytes it reads and writes. Video duration alone does not tell you the cost.

Those job counts are arithmetic from Rendi's example, not a subtitle benchmark. A real burned MP4 can be larger or smaller depending on the source, codec settings, and output. Measure your own input-plus-output total before forecasting volume.

Free costs $0 per month, includes 50 GB of processing, and limits a command to 1 minute of runtime. Entry Pro costs $25 per month, includes 250 GB, and raises the command cap to 10 minutes. The full Rendi pricing breakdown covers the larger CPU and unlimited-runtime configurations, so there is no reason to repeat that matrix here.

The comparison that matters is operational. Kapwing Pro is listed at $16 per member per month when billed annually, or $24 monthly. A visual editor is easier for an occasional one-off. Rendi makes more sense when caption finishing is a repeatable system step, triggered by approved assets and tracked without another person opening an editor.

Seven Workflows That Benefit Most

The best fit is not everyone who adds captions. It is the team that already has an approved SRT and keeps repeating the final render.

RankWho profitsExact workflowWhy it pays
1A social content team publishing recurring clipsApprove the transcript, apply a stored caption style, render an MP4 after each final cut, and route the result to reviewRemoves repeated upload, styling, export, and download work while keeping every platform copy visually consistent
2A localization agency delivering review mastersPair each approved language SRT with the same source, burn separate review MP4s, and retain the original subtitle filesClients can review timing and placement exactly as viewers will see it, while the agency keeps editable language assets
3A course operator with a growing lesson libraryTrigger a captioned derivative after a lesson master and SRT pass approval, then compare returned duration and dimensionsTurns caption finishing into a controlled release step instead of a manual editor task for every lesson
4A podcast studio cutting video excerptsFeed approved clips and corrected SRTs from the repurposing queue into one caption presetEditors spend their attention on hooks and cuts, not repeating the final subtitle export
5A support team maintaining product demosRe-render captioned demos whenever an approved script or interface recording changesMakes revisions traceable by source, subtitle revision, command ID, and reviewed output
6An automation agency building in n8n, Make, or ZapierSubmit the Rendi job from the workflow, wait through polling or webhook, and pass the stored URL to the next approved stepAdds media processing without running FFmpeg inside a restricted automation runtime
7A media team retrieving old footageFind the right source clip, attach an approved SRT, and create a fixed-caption review or social copyConnects retrieval to delivery without confusing search with rendering; the Reelback review covers the retrieval side

Three Products Worth Building

1. A Brand-Safe Batch Caption Finisher

This is the strongest opportunity. Build a narrow portal for content teams and agencies: accepted video URL, approved SRT, named style preset, review page, and downloadable MP4. The product sells repeatability and approval, not an all-purpose editor.

About 1,900 US searches a month go to add subtitles to a video, while Kapwing Pro starts at $16 per member per month on annual billing. That demand is broad enough to acquire users, and the recurring team workflow is specific enough to support a focused product.

The smallest sellable version needs signed-URL inputs, SRT validation, a handful of locked brand presets, Rendi submission, webhook handling, output metadata, and human accept or reject. The catch is defensibility. A form wrapped around one FFmpeg call is easy to copy. The durable value has to come from approval history, reusable brand rules, revision matching, and dependable failure recovery.

2. An Automation-First Subtitle Render API

Offer one stable endpoint to agencies that do not want their clients exposed to FFmpeg syntax. The customer sends a video URL, SRT URL, preset name, and callback URL. Your service translates the preset into a reviewed command and returns a normalized job result.

Burn subtitles into video records 40 US searches a month and an $8.16 CPC. The volume is small, but the intent is unusually specific. The PAA question, “How can I permanently burn SRT subtitles into a video?”, is almost the product request.

An MVP needs authentication, request validation, Rendi job mapping, idempotency keys, webhook verification, retry-safe state, and usage records. The catch is distribution. Search alone will not support the business, and Rendi already exposes the underlying API. The wrapper has to win through agency integrations, presets, observability, and support.

3. A Caption Preflight and Dual-Output Handoff

Build a review gate that checks one SRT against one final video, then produces a burned review MP4 and a selectable-track delivery MP4 from the approved pair. The buyer is a localization, training, or media-operations team that keeps losing track of which caption revision belongs to which cut.

The real PAA question “How do I add SRT subtitles to a video?” sits beside repeated confusion over permanent and selectable captions in the current results. The product answers both jobs without forcing the operator to choose the container mechanics alone.

The MVP needs cue parsing, duration comparison, safe-area preview, revision IDs, two controlled FFmpeg recipes, and a sign-off record. The catch is that basic SRT validation is a feature, not a company. The review history and handoff controls must be valuable enough that teams keep the product in their release process.

Limits and the Honest Take

Rendi removes FFmpeg infrastructure from this workflow. It does not remove editorial responsibility. It will not correct a transcript, repair bad timing, choose readable line breaks, or decide whether burned captions are the right accessibility format.

It also cannot make burn-in lossless. The subtitle filter changes the video frames, so the video is re-encoded. Quality, runtime, and output size depend on the command and source. The default API safety cap is 300 seconds, while the plan sets the maximum you can request. A long or compute-heavy job needs a plan whose command-runtime ceiling fits the actual encode.

Do not use this path for a single casual clip if a free browser tool already solves the job. Do not burn captions when viewers need to toggle them. Do not batch an unreviewed style. Rendi is compelling when the same approved finishing rule must run reliably across many assets.

The Monday Move

Take one short, approved video and its final SRT. Put both behind fetchable URLs, run the sample payload with your chosen style, inspect the returned metadata, and watch the whole MP4 on the smallest screen you support. Save the accepted command as a preset only after that review. Then connect the preset to the point where your workflow already marks video and captions approved.

How can I permanently burn SRT subtitles into a video?

Use FFmpeg's subtitles video filter so the text is rendered into every frame, then encode a new video. In Rendi, map the source video and SRT to in_ aliases, map the MP4 name to an out_ alias, submit the command, and wait for SUCCESS before downloading and reviewing it.

How to burn subtitles into a video?

Start with the final video and an approved subtitle file. Choose a burn command when the text must always be visible. Choose a selectable subtitle track when the viewer should control it. For Rendi, the documented burn path uses -vf subtitles={{in_srt}} and re-encodes the video.

How do I add SRT subtitles to a video?

You can either burn the SRT into the pixels or attach it as a separate subtitle track. Burning gives fixed appearance everywhere but cannot be turned off. A soft track stays editable and selectable. Rendi documents both the subtitles filter for burn-in and mov_text for a selectable MP4 track.

How to burn subtitles into video with HandBrake?

HandBrake provides a desktop interface for adding an external SRT and marking it as burned in. That is a sensible choice for occasional manual work. Rendi serves a different job: submitting the equivalent FFmpeg operation through an API when the render belongs inside an automated system.

If you want this kind of reviewed media pipeline built into your business, see AI production systems.

Last Updated
Sep 11, 2026
Category
Build

Prefer this site in Google

Add omidsaffari.com as a preferred source in Google Search

Mark omidsaffari.com as preferred and Google lifts it in Top Stories, AI Overviews and AI Mode for you.

Related Articles
How to Test Claude Code Plugins With Evals

How to Test Claude Code Plugins With Evals

Run Claude Code plugin evals, compare results with a no-plugin baseline, and budget the repeated agent and judge calls before adding CI.Sep 12, 2026Build
Debug Cloudflare Voice Agent Latency

Debug Cloudflare Voice Agent Latency

Trace slow and silent Cloudflare voice turns with stage timings and outcomes, then separate transcription, model, speech, and interruption problems.Sep 12, 2026Build
OpenAI Agents API vs Agents SDK

OpenAI Agents API vs Agents SDK

Compare the managed OpenAI Agents API with Agents SDK on session ownership, runtime control, sandbox costs, and migration work.Sep 11, 2026Build
Rendi Pricing (2026): Pick by Bytes, Not Video Length

Rendi Pricing (2026): Pick by Bytes, Not Video Length

Decode Rendi's FFmpeg API plans, byte-based processing, storage, runtime caps, and the smallest tier an automated video pipeline needs.Sep 11, 2026Build
How to Use Codex CLI Worktrees

How to Use Codex CLI Worktrees

Use Codex CLI worktrees for isolated coding sessions, then check branches, dependencies, resume behavior, and cleanup before keeping the change.Sep 10, 2026Build
How to Cap Claude Code Reasoning Effort

How to Cap Claude Code Reasoning Effort

Set Claude Code effort caps, understand which setting wins, and check routine-task quality while measuring token spend separately.Sep 10, 2026Build
agent-browser Video Recording FPS

agent-browser Video Recording FPS

Choose recording frame rates in agent-browser, check ffmpeg, and save readable QA videos with the new 30 fps default in v0.37.0.Sep 8, 2026Build
UltaHost VPS Renewal Pricing

UltaHost VPS Renewal Pricing

Decode UltaHost VPS renewal rates after the August price change, including introductory discounts, legacy plans, billing terms, and management limits.Sep 7, 2026Build
Newsletter

One letter, every Sunday.Working systems, not hot takes.

Weekly. No spam. Unsubscribe anytime.