CDN, Broadcast & Transport
MPEG Transport Streams: A Technical Reference
Published June 13, 2026
The MPEG-2 Transport Stream (ISO/IEC 13818-1) is the container format that underlies virtually all broadcast video delivery — satellite, cable, over-the-air, and HLS .ts segments on the web. If you’re building encoders, decoders, multiplexers, analyzers, or stream monitors, you need to understand it at the packet level. This reference covers the complete structure from the 188-byte header through ATSC and DVB signaling differences.
The 188-Byte Packet
Every MPEG-TS stream is a continuous sequence of fixed-length 188-byte packets. The fixed length is not an accident — it was chosen to align with the 204-byte RS(204,188) error-correction block used in DVB and ATSC transmitters (the 16 Reed-Solomon parity bytes occupy the remaining 16 bytes and are stripped before delivery to the decoder).
Each packet consists of:
Byte 0 : Sync byte (always 0x47)
Bytes 1–3 : Header (4 bytes total including sync)
Bytes 4–187: Adaptation field (optional) + Payload (up to 184 bytes)
Header Bit Layout
Byte 0: 0x47 (sync byte — loss of sync detected when this is missing)
Byte 1: [ TEI ][ PUSI ][ TP ][ PID bits 12–8 (5 bits) ]
Byte 2: [ PID bits 7–0 (8 bits) ]
Byte 3: [ TSC (2) ][ AFC (2) ][ CC (4) ]
| Field | Bits | Meaning |
|---|---|---|
| Sync byte | 8 | 0x47 — the only constant value in the entire TS |
| TEI | 1 | Transport Error Indicator — set by demodulator if packet contains uncorrectable bit errors. Discard the packet payload. |
| PUSI | 1 | Payload Unit Start Indicator — signals the start of a new PES packet or PSI section in the payload |
| TP | 1 | Transport Priority — higher priority than other packets with the same PID (rarely used) |
| PID | 13 | Packet Identifier — identifies the elementary stream or table this packet belongs to |
| TSC | 2 | Transport Scrambling Control — 00=not scrambled, 10=scrambled with even key, 11=scrambled with odd key |
| AFC | 2 | Adaptation Field Control — 01=payload only, 10=adaptation field only, 11=adaptation+payload, 00=reserved |
| CC | 4 | Continuity Counter — increments 0–15 for each successive packet with the same PID and AFC≠10. Gaps indicate loss. |
Adaptation Field
When AFC = 10 or 11, an adaptation field precedes the payload:
adaptation_field_length (1 byte) — length of the rest of the adaptation field
discontinuity_indicator (1 bit) — signals intentional CC discontinuity (channel change, splice)
random_access_indicator (1 bit) — 1 at stream access points (I-frame/keyframe boundaries)
elementary_stream_priority (1 bit)
PCR_flag (1 bit) — 1 if PCR follows
OPCR_flag (1 bit) — 1 if Original PCR follows
splicing_point_flag (1 bit) — 1 if splice countdown follows
transport_private_data_flag (1 bit)
adaptation_field_extension_flag (1 bit)
[PCR — 6 bytes, when PCR_flag=1]
[stuffing bytes — 0xFF to fill unused space]
The PCR (Program Clock Reference) when present:
PCR_base 33 bits (counts at 90 kHz, same clock as PTS/DTS)
reserved 6 bits
PCR_extension 9 bits (counts at 27 MHz)
True 27 MHz value = PCR_base × 300 + PCR_extension
Max PCR value ≈ 26.5 hours before wraparound
Stuffing bytes (0xFF) pad the adaptation field to fill the 188-byte boundary without carrying payload. When AFC=10, the entire payload area is adaptation field — this is used for null-packet stuffing and for carrying PCR without payload data.
PID Space
The 13-bit PID field gives 8192 possible values (0x0000–0x1FFF). Assignment:
PID | Reserved / standard assignment
──────────┼──────────────────────────────────────────────────────
0x0000 | PAT — Program Association Table (always here)
0x0001 | CAT — Conditional Access Table
0x0002 | TSDT — Transport Stream Description Table
0x0003 | IPMP Control Information Table
0x0004–0x000F | Reserved (ISO/IEC 13818-1)
0x0010 | DVB NIT — Network Information Table
0x0011 | DVB SDT/BAT — Service Description / Bouquet Association
0x0012 | DVB EIT — Event Information Table
0x0013 | DVB RST — Running Status Table
0x0014 | DVB TDT/TOT — Time and Date / Time Offset Table
0x0015 | DVB Network Synchronization Table
0x0016–0x001B | DVB reserved
0x001C | DVB Discontinuity Information Table
0x001D | DVB Selection Information Table
0x001E | DVB ancillary data table
0x001F | DVB reserved
0x0020–0x1FFA | Assigned by broadcaster (PMTs, video, audio, data PIDs)
0x1FFB | ATSC PSIP base PID — MGT, TVCT/CVCT, EIT, ETT, STT
0x1FFC–0x1FFE | Reserved
0x1FFF | Null packet — discard, used for CBR padding
The broadcaster-assigned range (0x0020–0x1FFA) is where all the program-specific content lives. The specific PIDs used for PMTs and elementary streams are arbitrary — what matters is that the PAT and PMT tables map them correctly.
PAT: Program Association Table
PID 0x0000, table_id 0x00
The PAT is the root of the MPEG-TS navigation tree. It lists every program carried in the multiplex and the PID where that program’s PMT can be found. A decoder starts here on cold boot.
PAT structure:
table_id = 0x00
section_syntax_indicator = 1
section_length (up to 1021 bytes)
transport_stream_id (16 bits) — identifies this multiplex
version_number (5 bits) — increments when content changes; decoder re-reads
current_next_indicator — 1 = current table, 0 = next version
section_number / last_section_number
For each program:
program_number (16 bits)
if program_number == 0x0000:
network_PID (13 bits) — PID of the NIT (DVB) or 0x1FFB (ATSC)
else:
program_map_PID (13 bits) — PID of this program's PMT
CRC_32
Example PAT — single-program TS (SPTS), program 1 at PMT PID 0x0100:
program_number = 0x0001
program_map_PID = 0x0100
Multi-program TS (MPTS) — satellite transponder carrying 8 programs:
program_number = 0x0001 → PMT at 0x0100 (program 1 = main HD channel)
program_number = 0x0002 → PMT at 0x0110 (program 2 = secondary SD channel)
program_number = 0x0003 → PMT at 0x0120 (program 3 = radio service)
...
A decoder scans the PAT, collects all program_map_PIDs, then reads each PMT to learn what elementary streams each program contains.
PMT: Program Map Table
PID = program_map_PID from PAT, table_id 0x02
The PMT describes one program completely: which PID carries the PCR, and what elementary streams (video, audio, data, subtitles) make up the program.
PMT structure:
table_id = 0x02
section_length
program_number (must match PAT)
version_number
current_next_indicator
section_number = 0
PCR_PID (13 bits) — PID carrying this program's clock reference
program_info_length
program_info_descriptors:
CA_descriptor (if scrambled)
registration_descriptor (format_identifier for private streams)
[others as needed]
For each elementary stream:
stream_type (8 bits) ← codec identifier
elementary_PID (13 bits) ← which PID carries this ES
ES_info_length
ES_info_descriptors:
ISO_639_language_descriptor (audio/subtitle language)
AC-3 descriptor (DVB) / nothing extra needed (ATSC)
subtitle_descriptor (DVB)
teletext_descriptor (DVB)
[others]
CRC_32
Example PMT for a US broadcast ATSC HD program:
PCR_PID = 0x0031
stream_type = 0x1B elementary_PID = 0x0031 [H.264 / AVC video]
[no additional descriptors needed — stream_type identifies it]
stream_type = 0x81 elementary_PID = 0x0034 [AC-3 / Dolby Digital — English]
ISO_639_language_descriptor: "eng"
stream_type = 0x81 elementary_PID = 0x0035 [AC-3 / Dolby Digital — Spanish]
ISO_639_language_descriptor: "spa"
stream_type = 0x86 elementary_PID = 0x0036 [SCTE-35 splice cue messages]
The stream_type field is the core codec identifier. Everything flows from it.
Elementary Stream Type Codes
The stream_type byte in the PMT is the primary codec identifier. Some values are globally standardized by ISO/IEC 13818-1; others are registered private values used only within ATSC or DVB contexts.
Video
| stream_type | Standard | Description |
|---|---|---|
| 0x01 | ISO/IEC 11172-2 | MPEG-1 Video |
| 0x02 | ISO/IEC 13818-2 (H.262) | MPEG-2 Video — standard-definition broadcast baseline |
| 0x10 | ISO/IEC 14496-2 | MPEG-4 Part 2 Video (rarely used in broadcast) |
| 0x1B | ISO/IEC 14496-10 (H.264) | AVC / H.264 — current ATSC HDTV and most OTT |
| 0x24 | ISO/IEC 23008-2 (H.265) | HEVC / H.265 — ATSC 3.0 (NEXTGEN TV), 4K UHD |
| 0x42 | SMPTE VC-1 | VC-1 / SMPTE 421M (used in some Blu-ray, rare in broadcast) |
Audio: ISO-Standardized
| stream_type | Standard | Description |
|---|---|---|
| 0x03 | ISO/IEC 11172-3 | MPEG-1 Audio — Layers 1, 2, and 3 (includes MP3) |
| 0x04 | ISO/IEC 13818-3 | MPEG-2 Audio — Layers 1 and 2 only (MP2) — not Layer 3 |
| 0x0F | ISO/IEC 13818-7 | AAC-LC in ADTS framing |
| 0x11 | ISO/IEC 14496-3 | HE-AAC / MPEG-4 Audio in LATM/LOAS framing |
MPEG-1 Layer 2 (MP2) vs 0x03 and 0x04: Both stream_type 0x03 and 0x04 appear in real streams carrying MP2 audio. The distinction matters because:
- 0x03 covers MPEG-1 audio (11172-3) including Layers 1, 2, and 3 at sample rates 32/44.1/48 kHz
- 0x04 covers MPEG-2 audio (13818-3) which adds multichannel extensions and lower sample rates, but in practice often used for the same plain stereo MP2 as 0x03
Decoders must accept both values for MP2 audio. DVB mandates MPEG-1 Layer 2 as the minimum audio baseline for SD MPEG-2 broadcasts in Europe; ATSC never used MP2.
Audio: ATSC Private (0x80–0x87 range)
| stream_type | Description |
|---|---|
| 0x81 | AC-3 / Dolby Digital — ATSC private, used in all ATSC broadcasts |
| 0x82 | SCTE-27 subtitles (some cable deployments) |
| 0x87 | E-AC-3 / Dolby Digital Plus — ATSC A/52 Annex E |
These are registered private stream types — valid only within ATSC-defined systems. A DVB decoder encountering 0x81 would not know what it is without additional context.
Data and Private
| stream_type | Description |
|---|---|
| 0x05 | ISO/IEC 13818-1 private sections (DSM-CC, DVB data services) |
| 0x06 | PES with private data — DVB’s container for Dolby, teletext, subtitles |
| 0x0B | ISO/IEC 13818-6 DSM-CC type B |
| 0x86 | SCTE-35 splice information (cue messages for ad insertion) |
ATSC vs DVB: The Dolby Digital Problem
This is the most practically important difference between ATSC and DVB transport streams for anyone building a decoder or analyzer.
ATSC: stream_type 0x81
In an ATSC transport stream (US broadcast), Dolby Digital (AC-3) audio is identified by stream_type = 0x81 in the PMT. No additional descriptors are required to identify the codec — the stream_type alone is sufficient. The decoder knows: stream_type 0x81 = AC-3, period.
ATSC PMT entry for Dolby Digital:
stream_type = 0x81
elementary_PID = 0x0034
ES_info_length = 6
ISO_639_language_descriptor: {language_code="eng", audio_type=0x00}
The PES stream_id for AC-3 in ATSC is typically 0xBD (private stream 1) — the same value used for DVD Dolby Digital. This means the AC-3 audio data arrives in PES packets framed with 00 00 01 BD start codes.
DVB: stream_type 0x06 + descriptor
In a DVB transport stream (European broadcast, as well as many satellite and cable systems worldwide), Dolby Digital uses stream_type = 0x06 (private PES data). The stream_type alone doesn’t tell you it’s AC-3 — you must look at the PMT descriptors attached to that elementary stream:
Option A: AC-3 descriptor (DVB, tag 0x6A) — defined in ETSI EN 300 468:
DVB PMT entry for Dolby Digital:
stream_type = 0x06
elementary_PID = 0x0044
ES_info_length = ...
AC-3 descriptor (tag = 0x6A):
{component_type_flag, bsid_flag, mainid_flag, asvc_flag, ...}
ISO_639_language_descriptor: {language_code="eng"}
Option B: enhanced_AC-3 descriptor (DVB, tag 0x7A) — for Dolby Digital Plus on DVB:
enhanced_AC-3 descriptor (tag = 0x7A): {...}
Option C: registration_descriptor with format_identifier “AC-3” — less common but valid:
registration_descriptor: format_identifier = 0x41 0x43 0x2D 0x33 ("AC-3" in ASCII)
The practical impact:
| Scenario | Dolby identification |
|---|---|
| ATSC stream | Check stream_type == 0x81 — done |
| DVB stream | Check stream_type == 0x06, then scan ES descriptors for tag 0x6A (AC-3) or 0x7A (E-AC-3) |
| Mixed/unknown | Check stream_type first; if 0x06, scan descriptors; if 0x81, assume ATSC AC-3 |
An analyzer or decoder that only checks stream_type will miss Dolby in all DVB streams. A decoder that only looks for DVB descriptors will miss Dolby in all ATSC streams. Both code paths are required.
DVB Dolby Plus (E-AC-3)
For Dolby Digital Plus on DVB, the same pattern applies: stream_type 0x06 with an enhanced_AC-3_descriptor (tag 0x7A). ATSC uses stream_type 0x87 instead.
PCM Audio
Linear PCM (uncompressed) in broadcast transport streams:
- In ATSC, PCM audio is carried as stream_type 0x80 (private) in some systems, or muxed in the adaptation field’s private data area
- In DVB, PCM is rarely carried in standard broadcast TS; it appears in Blu-ray (LPCM, stream_type 0x80) and professional contribution formats
- In contribution-grade SMPTE 2110 / SDI environments, audio is typically delivered via AES3 embedded in SDI rather than in the transport stream
ATSC SI Tables
ATSC uses a separate signaling system called PSIP (Program and System Information Protocol), defined in ATSC A/65. All ATSC PSIP tables are carried at PID 0x1FFB.
MGT: Master Guide Table
table_id 0xC7, PID 0x1FFB
The MGT is the index for all PSIP tables. It lists every table type and its PID, version, byte length, and CRC. A decoder must read the MGT before it can find TVCT, EIT, or ETT tables.
MGT table entries:
table_type = 0x0000 → TVCT (current) at PID 0x1FFB
table_type = 0x0001 → TVCT (next)
table_type = 0x0002 → CVCT (current) at PID 0x1FFB
table_type = 0x0003 → CVCT (next)
table_type = 0x0100 → EIT-0 at PID [specified in MGT]
table_type = 0x0101 → EIT-1
table_type = 0x0102 → EIT-2
table_type = 0x0103 → EIT-3
table_type = 0x0200 → ETT-0 (Extended Text Table for EIT-0)
table_type = 0x0201 → ETT-1
...
table_type = 0x0301–0x03FF → channel ETTs (text for channel name/description)
TVCT: Terrestrial Virtual Channel Table
table_id 0xC8, PID 0x1FFB (for terrestrial ATSC 8VSB broadcasts)
The TVCT defines the virtual channel map — the mapping between the logical channel numbers that viewers see on their guide and the physical program numbers in the transport stream. This is how 4-1, 4-2, 7-1 channel numbers are established.
Key fields per channel entry:
| Field | Size | Description |
|---|---|---|
| short_name | 7 × 16-bit | UTF-16 encoded channel name (e.g., “WNBC “) |
| major_channel_number | 10 bits | RF channel number (1–99), e.g., 4 for WNBC NY |
| minor_channel_number | 10 bits | Sub-channel (1–99); 0 = one-part channel number |
| modulation_mode | 8 bits | 0x04 = 8-VSB (terrestrial ATSC) |
| carrier_frequency | 32 bits | Center frequency in Hz (rarely used by receivers) |
| channel_TSID | 16 bits | Transport stream ID of the multiplex carrying this channel |
| program_number | 16 bits | PMT program_number for this channel |
| ETM_location | 2 bits | Where extended text message for this channel is: 0=none, 1=in MGT, 2=in this PSIP TS, 3=reserved |
| access_controlled | 1 bit | Is the channel scrambled? |
| hidden | 1 bit | Hidden from UI (not for viewer use) |
| path_select | 1 bit | CVCT only — selects cable path A or B |
| out_of_band | 1 bit | CVCT only — carried on out-of-band channel |
| hide_guide | 1 bit | Remove from channel guide even if not hidden |
| service_type | 6 bits | 0x01=analog TV, 0x02=ATSC digital TV, 0x03=ATSC audio, 0x04=ATSC data |
| source_id | 16 bits | Cross-reference to EIT data — the EIT uses source_id to identify which channel events belong to |
Major/minor number example for New York:
short_name = "WNBC " major = 4 minor = 1 (main HD feed)
short_name = "NBC LX " major = 4 minor = 2 (secondary SD feed)
short_name = "NBCWx " major = 4 minor = 3 (weather channel)
CVCT: Cable Virtual Channel Table
table_id 0xC9, PID 0x1FFB (for digital cable)
The CVCT is structurally identical to the TVCT but is used on digital cable systems (QAM delivery). Key differences:
modulation_mode: 0x01=QAM-64, 0x03=QAM-256 (rather than 0x04=8-VSB)path_select: 1-bit field indicating cable A/B path (not in TVCT)out_of_band: for out-of-band (OOB) channel signaling used in some cable systems
Cable operators can and often do override or supplement TVCT/CVCT data from broadcasters with their own remapped channel maps. The cable headend may present a station as channel 4 in the VCT while actually placing it on QAM frequency 333 MHz with a completely different program_number.
EIT: Event Information Table
table_id 0xCB–0xD4 (EIT-0 through EIT-9), PIDs from MGT
The ATSC EIT provides program guide data. EIT-0 covers the present and next events for all channels in the multiplex. EIT-1, EIT-2, EIT-3 cover subsequent 3-hour blocks, extending the guide forward by 12 hours across the four standard EITs.
Key fields per event:
| Field | Description |
|---|---|
| source_id | Cross-reference to TVCT channel — identifies which channel this event belongs to |
| event_id | Unique identifier for this event |
| start_time | GPS seconds since midnight January 6, 1980 (not Unix time — ATSC uses GPS epoch) |
| ETM_location | Points to ETT for the full description text |
| length_in_seconds | Event duration |
| title_length + title_text | Short title in Multiple String Structure (UTF-16 or compressed) |
| audio_streams[] | Count and mode of audio streams for this event |
| caption_services | CC/subtitles available |
STT: System Time Table
table_id 0xCD, PID 0x1FFB
The STT provides UTC-aligned time reference in GPS seconds plus UTC offset. Receivers use it to display accurate current time and align program guide events to wall clock time. GPS time and UTC differ by leap seconds (currently 18 seconds as of 2024); the STT includes the GPS_UTC_offset field.
DVB SI Tables
DVB uses a richer but differently structured Service Information (SI) system, defined in ETSI EN 300 468. Unlike ATSC’s single PSIP PID, DVB SI is distributed across multiple fixed PIDs.
SDT: Service Description Table
table_id 0x42 (current TS) or 0x46 (other TS), PID 0x0011
The SDT is DVB’s equivalent of the ATSC VCT for channel identity — but significantly different in structure. It lists services (channels) with their names and types, but does not include logical channel numbers in the base spec.
SDT entry per service:
service_id (16 bits) — matches program_number in PAT
EIT_schedule_flag — does this service have schedule EIT?
EIT_present_following_flag — does it have present/following EIT?
running_status: 1=not running, 2=starts soon, 3=pausing, 4=running
free_CA_mode — 0=unscrambled, 1=scrambled
service_descriptor (tag 0x48):
service_type: 0x01=digital TV, 0x02=digital radio, 0x16=HEVC HD, etc.
service_provider_name: "BBC"
service_name: "BBC ONE"
Logical channel numbers in DVB are an optional extension. They are not in the SDT — they appear in the NIT via the logical_channel_number_descriptor (tag 0x83, defined in ETSI EN 300 468 Annex), which the NIT uses to map service_ids to viewer-facing channel numbers. This is one reason DVB channel numbering is more complex than ATSC.
NIT: Network Information Table
table_id 0x40 (current network) or 0x41 (other networks), PID 0x0010
The NIT describes the delivery network itself — the modulation parameters (satellite orbital position, transponder frequency, symbol rate, FEC rate, polarization for DVB-S2) and the logical channel map.
NIT structure:
network_id — identifies the network (e.g., BBC, Sky, FreeSAT)
network_descriptors:
network_name_descriptor: "Freeview"
linkage_descriptor: links to other networks
transport_stream_loop:
transport_stream_id
original_network_id
transport_descriptors:
satellite_delivery_system_descriptor:
frequency, orbital_position, polarization
roll_off, modulation_system (DVB-S2), modulation_type
symbol_rate, FEC_inner
logical_channel_number_descriptor:
[service_id=0x0001, LCN=1] ← BBC ONE on channel 1
[service_id=0x0002, LCN=2] ← BBC TWO on channel 2
[service_id=0x0003, LCN=3] ← ITV on channel 3
...
The NIT’s logical_channel_number_descriptor is where viewer-facing channel numbers come from in DVB. Unlike ATSC where the major/minor numbers are in the VCT (part of the PSIP in the broadcast TS), DVB separates network configuration (NIT) from service identity (SDT) from program content (PMT).
DVB EIT: Event Information Table
table_id 0x4E (present/following, current TS), 0x4F (p/f, other TS), 0x50–0x5F (schedule, current), 0x60–0x6F (schedule, other); PID 0x0012
DVB EIT is more elaborate than ATSC EIT:
- EIT p/f (table_id 0x4E): Present/following — current and next event for each service. Mandatory.
- EIT schedule (table_id 0x50–0x5F): Full 8-day program guide in 3-hour table sections. Optional but expected by EPG applications.
DVB EIT event entry:
event_id
start_time (UTC MJD + BCD time) ← DVB uses Modified Julian Date, not GPS epoch
duration (BCD: HH MM SS)
running_status: 4 = running now
free_CA_mode
short_event_descriptor (tag 0x4D):
language_code: "eng"
event_name: "The Evening News"
text: "Tonight's headlines..."
extended_event_descriptor (tag 0x4E):
[longer description, for complete show info]
content_descriptor (tag 0x54):
[genre codes: 0x20=sport, 0x10=film, 0x50=news, etc.]
parental_rating_descriptor (tag 0x55):
[age ratings by country]
DVB uses UTC/MJD time, ATSC uses GPS seconds. GPS time and UTC diverge by leap seconds — a DVB/ATSC interoperability point that catches implementers.
TDT/TOT: Time and Date Table / Time Offset Table
table_id 0x70 (TDT) and 0x73 (TOT), PID 0x0014
Provides UTC time in MJD format and, in the TOT, local time offsets and daylight saving transitions by country/region.
PCR: Program Clock Reference and Timing
The PCR is not a table — it’s embedded in the adaptation field of specific TS packets. The encoder writes a PCR timestamp every 40–100ms (DVB max 100ms, ATSC strongly recommends 100ms or less). The decoder uses incoming PCR packets to lock its 27MHz clock, which in turn drives PTS/DTS scheduling for video frames and audio samples.
PTS and DTS in PES headers use the same 90kHz timebase as PCR_base:
Presentation Timestamp (PTS): when to present the frame to the viewer
Decoding Timestamp (DTS): when to begin decoding (differs from PTS for B-frames in H.264/HEVC)
For H.264 and HEVC, the decoder must:
- Lock to PCR
- Buffer coded frames
- Decode at DTS-scheduled time
- Present at PTS-scheduled time
- Handle PCR jitter (max ±500ns per DVB spec for contribution; ±1000ns for distribution)
PCR discontinuity: When the bitstream is spliced (live event cut, ad insertion), the PCR will jump discontinuously. The discontinuity_indicator flag in the adaptation field signals this, preventing the decoder from treating it as network jitter.
SPTS vs MPTS
| SPTS (Single Program) | MPTS (Multi-Program) | |
|---|---|---|
| Programs in PAT | 1 | 2 or more |
| Typical use | Contribution, OTT, HLS/DASH segments | Satellite transponders, cable QAM channels, ATSC 6MHz RF channels |
| Bitrate | Only the program you need | Shared — individual programs may vary within total |
| Monitoring | Simple — one PAT, one PMT | Must monitor all PMTs and detect inter-program issues |
| Splicing | Straightforward | Complex — must maintain all PIDs simultaneously |
HLS .ts segments are always SPTS. Each segment contains a fresh PAT and PMT at the start (signaled by PUSI=1 on the PAT PID packet). This allows random access — a player can start at any segment boundary and immediately decode, without needing prior stream state.
Broadcast ATSC OTA: An ATSC 8VSB RF channel is a 19.39 Mb/s MPTS. A typical HD station uses ~13–15 Mb/s for a main 1080i H.264 program and splits the remaining bandwidth among one or two SD sub-channels (720p or 480i), each at 3–4 Mb/s.
Stream Type Quick Reference
| Code | Codec | Standard | Primary Use |
|---|---|---|---|
| 0x01 | MPEG-1 Video | ISO 11172-2 | Legacy |
| 0x02 | MPEG-2 Video (H.262) | ISO 13818-2 | SD broadcast, DVD |
| 0x03 | MPEG-1 Audio (MP1/MP2/MP3) | ISO 11172-3 | MP2 stereo (DVB SD) |
| 0x04 | MPEG-2 Audio (MP1/MP2) | ISO 13818-3 | MP2 stereo (DVB SD alt.) |
| 0x06 | Private PES | ISO 13818-1 | DVB: AC-3, E-AC-3, subtitles, teletext |
| 0x0F | AAC-LC ADTS | ISO 13818-7 | Internet radio, some broadcast |
| 0x11 | HE-AAC / MPEG-4 Audio | ISO 14496-3 | DAB+, some OTT |
| 0x1B | H.264 / AVC | ISO 14496-10 | ATSC HDTV, most OTT HLS |
| 0x24 | H.265 / HEVC | ISO 23008-2 | ATSC 3.0, 4K UHD, HEVC OTT |
| 0x81 | AC-3 / Dolby Digital | ATSC A/52 | ATSC only — all US broadcast audio |
| 0x86 | SCTE-35 | SCTE 35 | Ad insertion cue messages |
| 0x87 | E-AC-3 / Dolby Digital Plus | ATSC A/52E | ATSC secondary/alternate audio |
Further Reading
- ISO/IEC 13818-1 (MPEG-2 Systems) — The core MPEG-TS specification (available for purchase; many universities have access)
- ATSC A/65: PSIP Standard — Full PSIP specification (free download from ATSC)
- ATSC A/52: AC-3 Audio Coding — Dolby Digital standard (free from ATSC)
- ETSI EN 300 468 — DVB Service Information specification (free PDF from ETSI)
- DVB BlueBook A038 — DVB SI guidelines
- SCTE 35: Digital Program Insertion — Splice cue and ad insertion signaling in MPEG-TS
- MediaInfo — Free open-source tool that parses and displays all PAT/PMT/PID/stream_type information in any MPEG-TS file
- tsduck — Open-source MPEG-TS toolkit for analysis, transformation, and monitoring
Related guides
SRT, Zixi, and the Evolution of Reliable IP Video Transport
A broadcast engineer's history and technical comparison of ARQ-based IP video transport: Fujitsu's early proprietary protocol, Zixi's professional ecosystem, and SRT's open-source revolution — pros, cons, and when to use each.
guideDVB-S, DVB-S2, and DVB-S2X: A Broadcast Engineer's Guide
A technical deep-dive into satellite video delivery standards — DVB-S through S2X — covering modulation, FEC coding, bandwidth calculations, and how to choose the right MODCOD for your link.
guideHLS, DASH, and Modern CDN Video Delivery: A Technical Guide
How HLS and DASH actually work — manifest files, segments, adaptive bitrate ladders, push vs. just-in-time packaging, CDN architecture (CloudFront, Akamai, Cloudflare, Fastly), and emerging Media over QUIC transport.