音视频入门基础:MPEG2-PS专题(3)——MPEG2-PS格式简介

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

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

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

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

音视频入门基础:MPEG2-PS专题(3)——MPEG2-PS格式简介

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

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

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

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

音视频入门基础:MPEG2-PS专题(8)——使用Wireshark分析GB28181的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流简介》。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值