Skip to content
Back to the journal

Share your story

We sent 20 caption files through three paths. Export success missed changes.

An original reproducible SRT experiment with complete inputs, both runs, literal text and timing comparisons, and useful limits for checking an edited caption file.

The short answer

A successful conversion did not guarantee that the intended captions survived. In this local experiment, each FFmpeg path exported all twenty constructed cases, but six changed literal payload or timing. Wrapped.li’s narrower check exported fourteen unchanged and rejected six. Equal unchanged totals hid different cases. Review the actual file and final media; none of these measurements establishes LinkedIn acceptance or human readability.

What you’ll take away

  • Keep the original before running a conversion.
  • Compare cue text and timing, not just the exit message or file extension.
  • A strict subset can reject content another tool legitimately preserves.

The practical question: did my caption file keep its meaning?

Moving a caption file between tools can change more than its extension. A visible success message answers whether a processing step finished, not whether every intended cue, symbol and boundary survived. We tested this narrower preservation question using original exercise files rather than private videos or creator accounts.

The corpus contains twenty fixed cases: six container variations, six payload variations, six boundary challenges and an NFC/NFD Unicode pair. It includes ordinary line endings, German text, emoji, spaces, multiple lines, markup, overlap, an empty cue and invalid timing. These are deliberately related constructed cases, not twenty randomly sampled videos. Some challenge cases are not claimed to be conforming SRT.

Three fixed paths, every case, two complete runs

Before execution we saved the protocol, corpus, exact existing Wrapped.li caption function and runner with hashes. Path one called that function with zero offset. Path two explicitly demuxed SRT and encoded SRT in FFmpeg. Path three converted SRT to WebVTT and then back to SRT. The installed versions were Node v24.21.0 and FFmpeg 9.0.2. No alternative settings, repairs or replacement cases were tried after seeing results.

A separately implemented output parser compared cue count, exact millisecond boundaries and literal payload strings against declared intent. It accepted overlap and markup for measurement rather than reusing the checker’s admission rules. Only line endings were normalized: spaces, Unicode form and markup remained part of the comparison. We also recorded absent outputs, diagnostics and byte hashes. The second complete matrix matched every measured row and output hash. That is a repeatability check, not another sample.

Path, each with 20 casesExportedSame declared text/timeExported with changes
Wrapped.li plain-text subset14; 6 rejected140
FFmpeg SRT to SRT20146
FFmpeg SRT to WebVTT to SRT20146
All three paths preserve text and times in 14 of 20 constructed cases. Wrapped.li rejects six; FFmpeg exports six with changes. These are not validity or quality scores.
Original local file experiment. Every case remains in the table and dataset. Equal totals hide different cases; rejection can be appropriate for a declared subset.

All 20 cases, with no omitted results

C01–C20 follow the fixed corpus. Equality concerns declared characters and times after line-ending normalization, not appearance or format validity. Descriptions and original inputs are in the linked corpus.

CaseWrapped.liFFmpeg SRTFFmpeg VTT/SRT
C01Same text/timeSame text/timeSame text/time
C02Same text/timeSame text/timeSame text/time
C03Same text/timeSame text/timeSame text/time
C04Same text/timeSame text/timeSame text/time
C05Same text/timeSame text/timeSame text/time
C06Same text/timeSame text/timeSame text/time
C07Same text/timeSame text/timeSame text/time
C08Same text/timeChangedChanged
C09Same text/timeChangedChanged
C10Same text/timeChangedChanged
C11Same text/timeSame text/timeSame text/time
C12No exportSame text/timeSame text/time
C13No exportChangedChanged
C14No exportSame text/timeSame text/time
C15No exportChangedChanged
C16No exportChangedChanged
C17No exportSame text/timeSame text/time
C18Same text/timeSame text/timeSame text/time
C19Same text/timeSame text/timeSame text/time
C20Same text/timeSame text/timeSame text/time

Read the changed cases before judging the totals

Both FFmpeg paths changed the same six cases. C08 and C09 lost trailing or leading spaces. C10 retained separator whitespace as part of a cue. Those differences may have little visible consequence. A literal mismatch is not automatically a bad edit; it tells you what to inspect. The complete matrix does not silently discard such cases or count them as failures of human understanding.

C13 is more consequential: the literal source “A < B and C > D.” became “A <b> D.</b>” in the SRT output. That is a changed payload, not a browser-rendering observation. C15 started with a deliberately reversed 4,000-to-3,000ms interval; the output end became 4,294,970,296ms. C16’s empty first cue disappeared, leaving one output cue. All these tested commands exited successfully without a warning. Preserve originals and inspect the resulting text and times, especially when a file contains bracket-like notation or malformed cues.

The narrower checker is not a universal format judge

Wrapped.li’s declared plain-text subset rejected six cases and exported fourteen with their intended text and timing intact. Its rejection of markup and overlap was intentional. FFmpeg preserved the italic-markup, overlapping-cue and decimal-variation cases that it rejected. Therefore the equal fourteen-case preservation total does not mean the paths handled the same material or that our checker is a better caption editor.

The Library of Congress describes SRT’s limited formal documentation and reader-dependent styling; WebVTT has its own specified syntax and permits overlapping cues. A local rule against overlap is a workflow boundary, not proof that overlap is universally invalid. Decide whether your chosen workflow supports the actual content instead of flattening every rejection into a platform rule.

A reading-speed flag can count a different thing from your eyes

C19 contains twenty precomposed accented letters, and C20 contains twenty decomposed equivalents. The canonically equivalent strings contain twenty versus forty Unicode code points. At one second, the existing local checker reports 20 versus 40 code points per second and flags the latter. Both files retain their text. This is a concrete limit of the disclosed code-point heuristic, not evidence that one text takes twice as long for a person to read.

Do not rewrite someone’s language simply to clear an automatic flag. Inspect wording, line breaks, speech and available time in the real media. Formal preservation, a screening flag, synchronization and human comprehension are separate questions; this experiment only measures the first and records the existing flag.

Use the evidence as a preflight, with its limits intact

Keep a source copy, export into a new file, then compare the complete cue list and meaningful time boundaries. If a change was intentional, document it. If it was not, return to the source rather than repeatedly converting a damaged derivative. Finally play the actual media with captions and inspect the published result in its intended context. LinkedIn’s help describes attaching SRT captions on desktop, but we performed no upload or private-account test here.

The downloadable bundle contains both complete runs, all original inputs and outputs, code, version information and the pre-execution hashes. It includes no FFmpeg binary and requires installed Node/FFmpeg for reproduction. We tested these paths and versions, not every editor, encoding, player or caption service. No result establishes visual styling, glyph rendering, accessibility, reader preference, reach or revenue. This is one original file-processing study; repeated runs are not additional research pieces.

Sources & product references

Product details reflect the publication date. External features and interfaces may change.

WRAPPED.LI

Your year has a story. Find yours.

Explore your available activity, see the people behind it, and choose what to share.

Create my recapStart with a free profile preview. Premium is optional.
Wrapped.li editorial

Product guidance from Wrapped.li. Numerical examples are illustrative, not customer results. LinkedIn is a separate company.