音视频入门基础:MPEG2-PS专题(3)——MPEG2-PS格式简介
一、引言
本文对MPEG2-PS格式进行简介。
进行简介之前,请各位先下载MPEG2-PS的官方文档。ITU-T和ISO/IEC都分别提供MPEG2-PS的官方文档。但是ITU提供的文档是免费的,ISO/IEC是付费的,所以我们主要阅读ITU提供的官方文档,比如较新版的《T-REC-H.222.0-202106-S!!PDF-E.pdf》。
《T-REC-H.222.0-202106-S!!PDF-E.pdf》总共有340页。本文下面所说的“页数”是指在pdf阅读器中显示的页数:
二、program stream
官方文档中把MPEG2-PS称为program stream。所以MPEG2-PS、program stream、程序流、节目流、PS流是同一个东西,只是叫法不同。
根据《T-REC-H.222.0-202106-S!!PDF-E.pdf》第17页,PS流是一种流,专门用于在不太可能出错的环境中通信或存储一个节目的编码数据和其他数据。在出错可能性极低的环境,以及在系统编码处理(如软件处理)为主要考虑因素的环境中,PS流是专为通信或存储一个节目的编码数据和其他数据而设计的:
三、pack
根据《T-REC-H.222.0-202106-S!!PDF-E.pdf》第90页,PS流由一个个pack(包装)组成,使用pack_start_code(包装起始码,值固定为0x000001BA)分割各个pack。PS流/PS文件以0x000001B9为结束标志(但是根据我的观察,FFmpeg生成的PS文件是没有这个结束标志的,所以结束标志实际不一定有):
TS流与PS流的区别在于TS流的包结构是固定长度的,而PS流的包结构是可变长度的,这导致了它们对传输误码具有不同的抵抗能力。因此,在信道环境较为恶劣,传输误码较高时,一般采用TS码流;而在信道环境较好,传输误码较低时,一般采用PS码流。
四、pack header
根据《T-REC-H.222.0-202106-S!!PDF-E.pdf》第283页,每个pack最开始的部分就是pack header:
所以,一个pack = 一个pack_header + 一个或多个PES_packet
根据《T-REC-H.222.0-202106-S!!PDF-E.pdf》第90页,pack header包含下图所示部分:
其中,比较重要的属性有:
pack_start_code:占4字节,为一个pack的起始码。每个pack以固定的pack_start_code作为起始,其值固定为0x000001BA:
SCR:
system_clock_reference_base属性(占33位)和system_clock_reference_extension属性(占9位)组成了system clock reference (SCR):
根据《T-REC-H.222.0-202106-S!!PDF-E.pdf》第33页,system clock reference (SCR)为PS流中的时间戳,从中可以推导出解码器的时间:
PS流中的SCR跟跟TS流中的PCR类似,关于PCR可以参考:《音视频入门基础:MPEG2-TS专题(8)——TS Header中的适配域》。
通过Elecard Stream Analyzer工具可以查看PS流中pack header的信息:
五、system header
当且仅当该pack为PS流中的第一个数据包时其pack header中会存在system header。根据《T-REC-H.222.0-202106-S!!PDF-E.pdf》第33页,system header包含PS流系统特性的信息:
根据《T-REC-H.222.0-202106-S!!PDF-E.pdf》第91页,system header包含下图所示部分:
其中,比较重要的属性有:
system_header_start_code:占4字节,为system header的起始码。每个system header以固定的system_header_start_code作为起始,其值固定为0x000001BB:
header_length:占2字节,指定在这个字段后的字节数。所以,system header的长度 = header_length + 6:
stream_id:占1字节,指定PS流中各个ES流的类型和编号:
比如音频流取值为0xC0 至 0xDF,视频流取值为0xE0 至0xEF:
通过Elecard Stream Analyzer工具可以查看PS流中system header的信息:
六、PES packet
PS 流和 TS流的包都是基于 PES packet创建的。在PS流中,一个pack去掉pack header之后的数据就是PES packets。注意,一个pack可能包含一个或多个PES packet。
通过Elecard Stream Analyzer工具可以查看PS流中PES packet的信息:
关于PES packet的介绍可以参考:《音视频入门基础:MPEG2-TS专题(18)——PES流简介》。