音视频入门基础:MPEG2-TS专题(18)——PES流简介

=================================================================

音视频入门基础:MPEG2-TS专题系列文章:

音视频入门基础:MPEG2-TS专题(1)——MPEG2-TS官方文档下载

音视频入门基础:MPEG2-TS专题(2)——使用FFmpeg命令生成ts文件

音视频入门基础:MPEG2-TS专题(3)——TS Header简介

音视频入门基础:MPEG2-TS专题(4)——使用工具分析MPEG2-TS传输流

音视频入门基础:MPEG2-TS专题(5)——FFmpeg源码中,判断某文件是否为TS文件的实现

音视频入门基础:MPEG2-TS专题(6)——FFmpeg源码中,获取MPEG2-TS传输流每个transport packet长度的实现

音视频入门基础:MPEG2-TS专题(7)——FFmpeg源码中,读取出一个transport packet数据的实现

音视频入门基础:MPEG2-TS专题(8)——TS Header中的适配域

音视频入门基础:MPEG2-TS专题(9)——FFmpeg源码中,解码TS Header的实现

音视频入门基础:MPEG2-TS专题(10)——PSI、SI简介

音视频入门基础:MPEG2-TS专题(11)—— TS中的Section

音视频入门基础:MPEG2-TS专题(12)—— FFmpeg源码中,把各个transport packet组合成一个Section的实现

音视频入门基础:MPEG2-TS专题(13)——FFmpeg源码中,解析Section Header的实现

音视频入门基础:MPEG2-TS专题(14)——PAT简介

音视频入门基础:MPEG2-TS专题(15)——FFmpeg源码中,解析Program association section的实现

音视频入门基础:MPEG2-TS专题(16)——PMT简介

音视频入门基础:MPEG2-TS专题(17)——FFmpeg源码中,解析TS program map section的实现

音视频入门基础:MPEG2-TS专题(18)——PES流简介

音视频入门基础:MPEG2-TS专题(19)——FFmpeg源码中,解析TS流中的PES流的实现

音视频入门基础:MPEG2-TS专题(20)——ES流简介

音视频入门基础:MPEG2-TS专题(21)——FFmpeg源码中,获取TS流的视频信息的实现

音视频入门基础:MPEG2-TS专题(22)——FFmpeg源码中,获取TS流的音频信息的实现

音视频入门基础:MPEG2-TS专题(23)——通过FFprobe显示TS流每个packet的信息

音视频入门基础:MPEG2-TS专题(24)——FFmpeg源码中,显示TS流每个packet的pts、dts的实现

音视频入门基础:MPEG2-TS专题(25)——通过FFmpeg命令使用UDP发送TS流

音视频入门基础:MPEG2-TS专题(26)——通过FFmpeg命令使用RTP发送TS流

=================================================================

一、PES流

《T-REC-H.222.0-202106-S!!PDF-E.pdf》第32页对PES进行了定义。音视频及数字信号经过MPEG-2编码器进行数据压缩,形成基本码流(ES流),ES流再打包形成带有包头的码流,就是PES(Packetized Elementary Streams,打包的基本码流)。PES流就是ES流打包,再加上包头形成的:

《T-REC-H.222.0-202106-S!!PDF-E.pdf》第32页对PES packet(PES包)进行了定义。PS 流(Program Streams)和 TS流(Transport Streams)的packet(包)都是基于 PES packet创建的。对于TS流,由于PES packet一般要比transport packet(TS包)大,所以PES packet需要分割成多个包装载,TS流中的PES packet会被切割后装载到transport packet中,PES packet header跟在TS Header后面;对于PS流,PES packet header跟在pack header后面:

二、PES packet

根据《T-REC-H.222.0-202106-S!!PDF-E.pdf》第281页,一个PES packet结构如下:

PES流的基本单位是PES packet,一个PES packet由PES packet header(PES包的包头)和PES packet data bytes(PES包的负载)组成。即:

一个PES packet = PES packet header + PES packet data bytes

根据《T-REC-H.222.0-202106-S!!PDF-E.pdf》第61页到64页,一个PES packet包含的全部属性如下:

三、PES packet header

PES packet header分为固定长度部分和可选部分。其中:packet_start_code_prefix、stream_id、PES_packet_length这些属性是每个PES packet都会包含的,所以一般把它们称作PES packet header中的固定长度部分。

所以,PES packet header = 固定长度部分(packet_start_code_prefix、stream_id、PES_packet_length) + 可选部分(Optional PES header)

四、PES packet header中的固定长度部分

PES packet header中的固定长度部分总共占6个字节。因为packet_start_code_prefix占3字节、stream_id占1字节、PES_packet_length占2字节,这些属性加起来总共6个字节。

其中:

packet_start_code_prefix:占3字节,为PES packet header的起始码,值固定为:0x000001:

stream_id:占1字节,指定ES流的类型和编号:

比如音频流取值为0xC0 至 0xDF,视频流取值为0xE0 至0xEF:

PES_packet_length:占2字节:。指定在这个字段后的字节数,值可以为0。如果该属性的值为零,该PES packet可以是任意的长度,并且只有当PES packet携带的是视频数据的时候,该属性的值才可以为0:

PES_packet_length的值不为0的情况下,整个PES packet的大小 = PES_packet_length + 6


 

五、Optional PES header

Optional PES header是PES packet header中的可选部分,是否存在Optional PES header由PES packet header中的stream_id属性决定。可以看到,当stream_id的值不为program_stream_map、padding_stream、private_stream_2、ECM、EMM、program_stream_directory、DSMCC_stream、ITU-T Rec. H.222.1 type E stream时,PES packet header中才会存在Optional PES header:

Optional PES header结构如下:

Optional PES header中比较重要的属性有:

PTS_DTS_flags:占2位,为PTS和DTS的标志位。值为'10'时,PES packet header中会存在PTS;值为'11'时,PES packet header中会同时存在PTS和DTS;值为'00'时,PES packet header中不会出现PTS和DTS;禁止使用值为'01'的情况:

即:

ESCR_flag:占1位,ESCR标志位,值为1表示PES packet header有ESCR基域和扩展域,值为0则表示没有:

即:

ES_rate_flag:占1位,为ES rate标志位,值为1表示PES packet header有ES rate域,值为0表示没有:

即:

DSM_trick_mode_flag:占1位,为DSM_trick_mode标志位,值为1表示PES packet header有DSM_trick_mode域,值为0表示没有:

即:

additional_copy_info_flag:占1位,为additional_copy_info标志位,值为1表示PES packet header有additional_copy_info_flag域,值为0表示没有:

即:

PES_CRC_flag:占1位,为PES_CRC标志位,值为1表示PES packet header有PES_CRC域,值为0表示没有:

即:

PES_extension_flag:占1位,为PES_extension标志位,值为1表示PES packet header有PES_extension域,值为0表示没有:

即:

 PES_header_data_length:占1字节。指定可选字段占用的总字节数,以及包含在此PES packet header的任何填充字节。可选字段的存在和内容由PES_header_data_length属性之前的字节控制,也就是由PTS_DTS_flags、ESCR_flag、ES_rate_flag、DSM_trick_mode_flag、additional_copy_info_flag、PES_CRC_flag、PES_extension_flag这7个属性控制:

所以,整个PES packet header的长度 = PES_header_data_length + 9

六、PES_packet_data_byte

根据《T-REC-H.222.0-202106-S!!PDF-E.pdf》第73页,PES_packet_data_byte为PES packet负载中的数据,即基本码流(ES流)数据:

七、使用工具分析PES packet header

用Elecard Stream Analyzer工具打开一个TS文件,可以看到里面某个PES packet的PES packet header中的属性:

可以看到由于PES packet一般要比transport packet(TS包)大得多,所以需要将PES packet切割后装载到多个transport packet中。比如下图中的H.264的I帧非常大,所以切割后装载到多个transport packet中:

八、参考

百度百科——PES

wiki——Packetized elementary stream

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值