Extract KLV Metadata from MPEG-TS Using FFmpeg
This article provides a straightforward guide on how to extract Key-Length-Value (KLV) metadata from an MPEG-TS (.ts) video stream and save it to a text file using FFmpeg and FFprobe. You will learn the exact command-line instructions required to isolate the data stream, map it correctly, and export it into either raw binary format or a readable text format.
Understanding the KLV Stream
In an MPEG-TS container, KLV metadata (often used for MISB drone
telemetry) is typically stored in a timed metadata stream, separate from
the video and audio tracks. To extract this data, you must identify and
target the data stream (often represented by the d
specifier in FFmpeg).
Method 1: Extract Raw KLV Metadata to a File
To extract the raw KLV payload from the MPEG-TS file without re-encoding, use the following FFmpeg command. This copy-demuxes the data stream directly into a binary or text file:
ffmpeg -i input.ts -map 0:d -codec copy -f rawvideo output.klvCommand Breakdown: * -i input.ts:
Specifies the input MPEG-TS video file. * -map 0:d: Selects
all data streams (d) from the first input file
(0). This excludes video and audio streams. *
-codec copy: Copies the data stream stream directly without
re-encoding. * -f rawvideo: Forces the output format to raw
data. * output.klv: The destination file where the raw KLV
packets will be written (you can also use .txt or
.bin).
Method 2: Extract KLV Metadata as Human-Readable Text (JSON)
Because raw KLV data is binary, opening it in a standard text editor
will show unreadable characters. To convert and write this metadata into
a structured, readable text format (like JSON or XML), use
ffprobe, which is included with the FFmpeg suite:
ffprobe -v error -select_streams d -show_packets -show_data_hash ASC -of json input.ts > output.jsonCommand Breakdown: * -v error:
Suppresses unnecessary log messages, keeping the output clean. *
-select_streams d: Selects only the data stream containing
the KLV metadata. * -show_packets: Instructs ffprobe to
display packet configuration and data payloads. *
-show_data_hash ASC: Shows the payload data in an ASCII/Hex
readable layout. * -of json: Formats the output as a JSON
structure. * > output.json: Redirects the command-line
output into a text file named output.json.