Convert CEA-608 Captions to SRT Using FFmpeg

Extracting CEA-608 closed captions (also known as Line 21 captions) from video files and converting them into the widely supported SRT (SubRip) format is a common task in video post-production. This guide provides a straightforward, step-by-step tutorial on how to use the powerful command-line tool FFmpeg to locate, extract, and convert these embedded captions into a standalone SRT file.

Step 1: Identify the Caption Stream

Before extracting, you need to check how the CEA-608 captions are stored in your video file. They are typically stored in one of two ways: as a dedicated subtitle track or embedded directly inside the video stream (as SEI user data).

Run the following command to inspect your file:

ffmpeg -i input.mp4

Look at the output streams. If you see a stream labeled subtitle with the codec eia_608 or cea_608, note its stream number (e.g., 0:s:0).


Step 2: Extract Captions

Based on how the captions are stored, choose the appropriate command below.

Method A: If captions are stored as a separate subtitle track

If FFmpeg detects the captions as a separate subtitle stream (common in MKV, MP4, or MOV files), run this command:

ffmpeg -i input.mp4 -map 0:s:0 output.srt

Method B: If captions are embedded inside the video stream

If the captions do not show up as a separate stream because they are embedded directly inside the video data (common in MPEG-TS or broadcast MXF files), you must use FFmpeg’s lavfi (libavfilter) input virtual device to extract the closed captions (subcc):

ffmpeg -f lavfi -i "movie=input.mp4[out0+subcc]" output.srt

Step 3: Troubleshooting Timing and Encoding

Sometimes, extracted SRT files can have sync issues or character encoding problems. You can resolve these by adding specific flags to your FFmpeg command.

Fix Sync Issues

If the subtitle timings are offset, you can shift the timestamps of the generated SRT file using the -itsoffset flag:

ffmpeg -itsoffset 00:00:02 -i input.mp4 -map 0:s:0 output.srt

(This shifts the subtitles forward by 2 seconds. Use a negative value to shift them backward).

Force UTF-8 Encoding

To ensure maximum compatibility with modern media players, force FFmpeg to write the SRT file in UTF-8 encoding:

ffmpeg -i input.mp4 -map 0:s:0 -c:s srt -sub_charenc UTF-8 output.srt