Skip to content

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) ]
FieldBitsMeaning
Sync byte80x47 — the only constant value in the entire TS
TEI1Transport Error Indicator — set by demodulator if packet contains uncorrectable bit errors. Discard the packet payload.
PUSI1Payload Unit Start Indicator — signals the start of a new PES packet or PSI section in the payload
TP1Transport Priority — higher priority than other packets with the same PID (rarely used)
PID13Packet Identifier — identifies the elementary stream or table this packet belongs to
TSC2Transport Scrambling Control — 00=not scrambled, 10=scrambled with even key, 11=scrambled with odd key
AFC2Adaptation Field Control — 01=payload only, 10=adaptation field only, 11=adaptation+payload, 00=reserved
CC4Continuity 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_typeStandardDescription
0x01ISO/IEC 11172-2MPEG-1 Video
0x02ISO/IEC 13818-2 (H.262)MPEG-2 Video — standard-definition broadcast baseline
0x10ISO/IEC 14496-2MPEG-4 Part 2 Video (rarely used in broadcast)
0x1BISO/IEC 14496-10 (H.264)AVC / H.264 — current ATSC HDTV and most OTT
0x24ISO/IEC 23008-2 (H.265)HEVC / H.265 — ATSC 3.0 (NEXTGEN TV), 4K UHD
0x42SMPTE VC-1VC-1 / SMPTE 421M (used in some Blu-ray, rare in broadcast)

Audio: ISO-Standardized

stream_typeStandardDescription
0x03ISO/IEC 11172-3MPEG-1 Audio — Layers 1, 2, and 3 (includes MP3)
0x04ISO/IEC 13818-3MPEG-2 Audio — Layers 1 and 2 only (MP2) — not Layer 3
0x0FISO/IEC 13818-7AAC-LC in ADTS framing
0x11ISO/IEC 14496-3HE-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_typeDescription
0x81AC-3 / Dolby Digital — ATSC private, used in all ATSC broadcasts
0x82SCTE-27 subtitles (some cable deployments)
0x87E-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_typeDescription
0x05ISO/IEC 13818-1 private sections (DSM-CC, DVB data services)
0x06PES with private data — DVB’s container for Dolby, teletext, subtitles
0x0BISO/IEC 13818-6 DSM-CC type B
0x86SCTE-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:

ScenarioDolby identification
ATSC streamCheck stream_type == 0x81 — done
DVB streamCheck stream_type == 0x06, then scan ES descriptors for tag 0x6A (AC-3) or 0x7A (E-AC-3)
Mixed/unknownCheck 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:

FieldSizeDescription
short_name7 × 16-bitUTF-16 encoded channel name (e.g., “WNBC “)
major_channel_number10 bitsRF channel number (1–99), e.g., 4 for WNBC NY
minor_channel_number10 bitsSub-channel (1–99); 0 = one-part channel number
modulation_mode8 bits0x04 = 8-VSB (terrestrial ATSC)
carrier_frequency32 bitsCenter frequency in Hz (rarely used by receivers)
channel_TSID16 bitsTransport stream ID of the multiplex carrying this channel
program_number16 bitsPMT program_number for this channel
ETM_location2 bitsWhere extended text message for this channel is: 0=none, 1=in MGT, 2=in this PSIP TS, 3=reserved
access_controlled1 bitIs the channel scrambled?
hidden1 bitHidden from UI (not for viewer use)
path_select1 bitCVCT only — selects cable path A or B
out_of_band1 bitCVCT only — carried on out-of-band channel
hide_guide1 bitRemove from channel guide even if not hidden
service_type6 bits0x01=analog TV, 0x02=ATSC digital TV, 0x03=ATSC audio, 0x04=ATSC data
source_id16 bitsCross-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:

FieldDescription
source_idCross-reference to TVCT channel — identifies which channel this event belongs to
event_idUnique identifier for this event
start_timeGPS seconds since midnight January 6, 1980 (not Unix time — ATSC uses GPS epoch)
ETM_locationPoints to ETT for the full description text
length_in_secondsEvent duration
title_length + title_textShort title in Multiple String Structure (UTF-16 or compressed)
audio_streams[]Count and mode of audio streams for this event
caption_servicesCC/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:

  1. Lock to PCR
  2. Buffer coded frames
  3. Decode at DTS-scheduled time
  4. Present at PTS-scheduled time
  5. 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 PAT12 or more
Typical useContribution, OTT, HLS/DASH segmentsSatellite transponders, cable QAM channels, ATSC 6MHz RF channels
BitrateOnly the program you needShared — individual programs may vary within total
MonitoringSimple — one PAT, one PMTMust monitor all PMTs and detect inter-program issues
SplicingStraightforwardComplex — 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

CodeCodecStandardPrimary Use
0x01MPEG-1 VideoISO 11172-2Legacy
0x02MPEG-2 Video (H.262)ISO 13818-2SD broadcast, DVD
0x03MPEG-1 Audio (MP1/MP2/MP3)ISO 11172-3MP2 stereo (DVB SD)
0x04MPEG-2 Audio (MP1/MP2)ISO 13818-3MP2 stereo (DVB SD alt.)
0x06Private PESISO 13818-1DVB: AC-3, E-AC-3, subtitles, teletext
0x0FAAC-LC ADTSISO 13818-7Internet radio, some broadcast
0x11HE-AAC / MPEG-4 AudioISO 14496-3DAB+, some OTT
0x1BH.264 / AVCISO 14496-10ATSC HDTV, most OTT HLS
0x24H.265 / HEVCISO 23008-2ATSC 3.0, 4K UHD, HEVC OTT
0x81AC-3 / Dolby DigitalATSC A/52ATSC only — all US broadcast audio
0x86SCTE-35SCTE 35Ad insertion cue messages
0x87E-AC-3 / Dolby Digital PlusATSC A/52EATSC secondary/alternate audio

Further Reading

Related guides