TS封装格式

介绍

TS是一种封装格式(容器),每个pack大小固定为188(或固定为204)字节,整体可分为三层。

es层:音视频数据

pes层:在es层上添加时间戳、音视频流标识等信息

ts层:在pes层的基础上添加数据流的识别和传输必须的信息

TS层

TS层由TS Header、adaptation组成,内容是通过 PID 值来标识的,主要内容包括:PAT 表、PMT 表、⾳频流、视频流。

1、TS Header固定为4字节,如下:

字段

bit

说明

sync_byte

8

TS包的标识符,固定为0x47

transport_error_indicator

1

传输错误指示符,1:表明在ts头的adapt域后由⼀个⽆⽤字节,通常都为0,这个字节算在adapt域⻓度内

payload_unit_start_indicator

1

负载单元起始标示符,⼀个完整的数据包开始时标记为1

transport_priority

1

传输优先级,0为低优先级,1为⾼优先级,通常取0

PID

13

指示该包有效载荷的数据类型,PAT:节目相关表,PID:0x000,PMT:传输流描述表PID:0x002

transport_scrambling_control

2

传输加扰控制,00表示未加密

adaptation_field_control

2

是否包含⾃适应区,‘00’保留;‘01’为⽆⾃适应域,仅含有效负载;‘10’为仅含⾃适应域,⽆有效负载;‘11’为同时带有⾃适应域和有效负载

continuity_counter

4

递增计数,从0到F,不一定从0开始,但必须递增,且为同一PID下的计数

注意:

1、PAT 表的和 PMT 表需要定期插⼊到TS流中,因为⽤户随时可能加⼊TS流,通常每隔⼏个视频帧就要加⼊ PAT和 PMT。PAT 和 PMT 表是必须的,还可以加⼊其它表如 SDT(业务描述表)等

2、PAT包、PMT包不含自适应域

2、adaptation:自适应域

adaptation_field_length

8bit

adaptation_field的字节数,仅含自适应域时为183,同时有有效负载时为0-182的区间内

discontinuity_indicator

1bit

1:指示当前传输流包的不连续性状态为真,不连续性分为系统时间基不连续和计数不连续

random_access_indicator

1bit

1:指示当前的传输流包以及可能的具有相同 PID 的后续传输流包

elementary_stream_priority_indicator

1bit

传输流包的优先级

PCR_flag

1bit

1:自适应域含PCR

OPCR_flag

1bit

1:自适应域含OPCR

splicing_point_flag

1bit

1:指示 splice_countdown 字段必须在相关自适应字段中存在,指定拼接点的出现

transport_private_data_flag

1bit

是否包含private_data

adaptation_field_extension_flag

1bit

是否包含扩展字段

program_clock_reference_base

33bit

PCR_ base

program_clock_reference_extension

9bit

PCR_ext

transport_private_data_length

8bit

补充:

1、PCR:指示PCR_ base最后字节到达系统目标解码器输入端的预期时间,分为两部分编码,共42bit,PCR_ base:33bit,PCR_ext:9bit

3、PAT(节目相关表)

table_id
8
PAT表固定为0x00
section_syntax_indicator
1 固定为1
section_length
12
开头两比特必为‘0 0 ’,剩余 10 比特指定该分段的字节数,不应超过1021(0x3FD)
transport_stream_id
16 由用户规定
version_number
5
版本号,固定为00000,如果PAT有变化则版本号加1
current_next_indicato
r
1
固定为1,表示这个PAT表可以⽤,如果为0则要等待下⼀个
PAT表
section_number
8
固定为0x00
last_section_number
8
固定为0x00
循环
program_number
16
可以把 program_number 用做为广播信道的标识
reserved
3
固定为111
PID
13
节⽬号对应内容的PID值
结束循环
CRC32
32
前⾯数据的CRC32校验码

例:如下是一个TS Pack(108字节),有效载荷为PAT表,

47 40 00 10     00 00 B0 0D 00 01 C1 00 00 00 01 E0 20 A2 C3 29 41   FF FF FF FF FF FF FF FF FF ....
TS Header       PAT表                                                无效填充

注:1、PAT包、PMT包不含自适应域

4、PMT(传输流描述表)

table_id
8

PMT固定为0x02

section_syntax_indicator 1 固定为1
section_lenth  12 该字段的头两比特必为‘00
program_number 16
version_number
5
当分段内承载的信息发生改变时,版本号应增 1
current_next_indicator
1
置于‘1’时指示发送的 TS_program_map_section 为当前有 效的
section_number
8
0x00
last_section_number
8 0x00
PCR_PID
13
指示传输流包的 PID
program_info_length
12
该字段的头两比特必为‘ 00
stream_type
8 流类型:AVC:0x1b,H265:0x24
elementary_PID
13
指定承载相关节目元的传输流包的 PID
ES_info_length
12 该字段的头两比特必为‘00
CRC_32
32

例:如下是一个TS Pack(108字节),有效载荷为PMT表

47 40 20 10     00 02 B0 12 00 01 C1 00 00 E0 22 F0 00 1B E0 22 F0 00 EB 47 5F DC     FF FF FF FF FF FF ....
TS Header       PMT表                                                                无效填充

5、PES

packet_start_code_prefix
24bit PES起始码:0x000001
stream_id
8bit
⾳频取值(0xc0-0xdf),通常为0xc0
视频取值(0xe0-0xef),通常为0xe0
PES_packet_length
16bit
后⾯pes数据的⻓度,0表示⻓度不限制, 只有视频数据⻓度会超过0xffff
flag
通常取值0x80,表示数据不加密、⽆优先级、备份的数据
flag
取值0x80表示只含有pts,取值0xc0表示含有pts和dts
pes data length
后⾯数据的⻓度,取值5或10
PTS
33bit
DTS
33bit

例:如下是一个TS Pack(188字节),有效负载PES层数据+ES层数据(H264)

47 40 22 30   07 50 00 0D 54 CA 7E 53     00 00 01 E0 00 00 80 C0 0A 31 00 6B 53 29 11 00 6B 53 29   
TS Header     自适应域                     PES起始码:00 00 01 流ID:E0  字节数:00 00 
00 00 00 01   09 F0                00 00 00 01 67 64 00 1F AC 2C 6A 81 40 16 E9 B8 08 08 08 10 00 00 00 01 68 ....
NALU起始码     type:09(分解符)    NALU.....
注:
视频DTS算法:
dts = 初始值 + 90000 / video_frame_rate ,初始值可以随便指定,但是最好不要取0
4、ES层
ES层为元数据层,在此不赘述

你可能感兴趣的:(TS流封装,ffmpeg)