| 필드 | 크기 | 설명 |
|---|---|---|
| Sync Byte | 1 byte | 항상 0x47, 패킷 시작 식별자 |
| Header | 3~4 bytes | PID, continuity counter 등 포함 |
| Payload | 나머지 | 실제 데이터 (ES, PSI 등) |
Ts Header
| 필드명 | 크기 | 설명 |
|---|---|---|
| Sync byte | 8비트 | 항상 0x47 → TS 패킷의 시작을 나타냄 |
| Transport Error Indicator | 1비트 | 오류 발생 여부 (1이면 오류 있음) |
| Payload Unit Start Indicator | 1비트 | PSI나 PES의 시작 여부 (1이면 새 섹션/프레임 시작) |
| Transport Priority | 1비트 | 우선순위 정보 (잘 안 쓰임) |
| PID | 13비트 | 이 TS 패킷이 어떤 데이터(PAT, PMT, PES 등)를 담고 있는지 식별 |
| Transport Scrambling Control | 2비트 | 암호화 여부 (00: 스크램블 없음) |
| Adaptation Field Control | 2비트 | payload, adaptation 필드 포함 여부 |
| Continuity Counter (CC) | 4비트 | 패킷 순서 추적용 4비트 카운터 (0~15 순환) |
Adaptation Field Control 종류
| 값 (2비트) | 의미 | 설명 |
|---|---|---|
00 |
예약됨 | 사용 금지 (표준상 불허, 오류 처리 대상) |
01 |
Payload only | Adaptation Field 없이 payload만 있음 |
10 |
Adaptation Field only | Payload 없음, Adaptation Field만 존재 |
11 |
Adaptation Field + Payload | 둘 다 있음 (먼저 Adaptation, 그 뒤에 Payload) |
예시
[ TS Packet (PID: 0x0000) ]
├── Header
└── Payload:
└── PSI (PAT Table)
[ TS Packet (PID: 0x0030) ]
├── Header
└── Payload:
└── PSI (PMT Table)
[ TS Packet (PID: 0x0100) ]
├── Header
└── Payload:
└── PES Header + ES (Video)
[ TS Packet (PID: 0x1FFF) ]
├── Header
└── Payload:
└── NULL (무의미한 패딩)
Program Number 1 → PMT PID 0x0030
Program Number 2 → PMT PID 0x0042
Hex 구조
00 B0 0D 00 01 C1 00 00 00 01 E0 30 2B B1 04 B2
PAT 테이블 (PID: 0x0000)
├─ table_id: 0x00 (PAT)
├─ section_syntax_indicator: 1
├─ section_length: 13 bytes
├─ transport_stream_id: 0x0001
├─ version_number: 0
├─ current_next_indicator: 1
├─ section_number: 0
├─ last_section_number: 0
├─ program 1:
│ ├─ program_number: 1
│ └─ program_map_PID: 0x0030
└─ CRC_32: 0x2AB104B2
Program 1:
- Video: PID 0x0100 (H.264)
- Audio: PID 0x0101 (AAC)
- Subtitle: PID 0x0102
Hex구조
02 B0 17 00 01 C1 00 00 E1 00 00
1B E1 00 00
0F E1 01 00
2A B1 04 B2
PMT 테이블 (PID: 0x0030)
├─ table_id: 0x02 (PMT)
├─ section_syntax_indicator: 1
├─ section_length: 23 bytes
├─ program_number: 1
├─ version_number: 0
├─ current_next_indicator: 1
├─ section_number: 0
├─ last_section_number: 0
├─ PCR_PID: 0x0100
├─ program_info_length: 0
├─ stream 1:
│ ├─ stream_type: 0x1B (H.264 Video)
│ └─ PID: 0x0100
├─ stream 2:
│ ├─ stream_type: 0x0F (AAC Audio)
│ └─ PID: 0x0101
└─ CRC_32: 0x2AB104B2
연결된 흐름
1. TS Packet의 PID가 0x0000이면 → PAT
2. PAT 안에는:
- Program Number = 1 → PMT PID = 0x0030
- Program Number = 2 → PMT PID = 0x0042
3. 그 다음, TS Packet에서 PID 0x0030을 찾아서 → PMT 확인
4. PMT 안에는:
- stream_type = 0x1B → PID 0x0100 (H.264 비디오)
- stream_type = 0x0F → PID 0x0101 (AAC 오디오)
PSI의 공통 구조
| 필드명 | 크기 | 설명 |
|---|---|---|
| table_id | 8비트 | 이 테이블이 PAT인지 PMT인지 구분0x00: PAT, 0x02: PMT |
| section_syntax_indicator | 1비트 | 항상 1 (섹션 구조 사용) |
| ‘0’ bit | 1비트 | 항상 0 |
| reserved | 2비트 | 예약 비트 |
| section_length | 12비트 | section_length 다음부터 CRC까지의 총 바이트 수 (최대 1021) |
| transport_stream_id | 16비트 | 이 테이블이 설명하는 스트림 ID (예: 방송 스트림의 고유 번호) |
| reserved | 2비트 | 예약 비트 |
| version_number | 5비트 | 테이블 버전 (업데이트 추적용) |
| current_next_indicator | 1비트 | 현재 테이블인지, 다음에 적용될 예정인지 표시 |
| section_number | 8비트 | 섹션 번호 (다중 섹션일 경우 구분용) |
| last_section_number | 8비트 | 섹션의 총 개수 - 1 |
| ⬇️ 이후부터는 테이블별 고유 필드 (PAT, PMT 등에서 달라짐) | ||
| ... | ... | 프로그램 정보, 스트림 정보 등 |
| CRC_32 | 32비트 | 섹션 끝에 항상 붙는 오류 검출용 CRC |
PAT 고유 구조
| 필드명 | 크기 | 설명 |
|---|---|---|
| program_number | 16비트 | 프로그램 번호 (0이면 NIT, 그 외는 실제 방송) |
| reserved | 3비트 | 예약 비트 |
| program_map_PID | 13비트 | 해당 프로그램의 PMT가 있는 PID |
PMT 고유 구조
| 필드명 | 크기 | 설명 |
|---|---|---|
| reserved | 3비트 | 예약 비트 |
| PCR_PID | 13비트 | 이 프로그램의 동기 기준용 PID (보통 비디오 PID) |
| reserved | 4비트 | 예약 비트 |
| program_info_length | 12비트 | 부가정보 길이 (보통 0) |
| 이후 stream 반복 정보: | ||
| stream_type | 8비트 | 비디오, 오디오, 자막 타입 (예: 0x1B = H.264) |
| reserved | 3비트 | 예약 비트 |
| elementary_PID | 13비트 | 이 스트림의 TS 패킷 PID |
| reserved | 4비트 | 예약 비트 |
| ES_info_length | 12비트 | 스트림별 부가정보 길이 |
패킷 손실 여부, 중복 여부등을 확인하기 위해 사용됨
PID 0x0100의 패킷들:
... → CC=13 → CC=14 → CC=15 → CC=0 → CC=1 ...