要从PS流(Program Stream)中解析出裸H.264数据,通常需要以下几个步骤:
一个完整的PS流通常包含以下结构:
-
Pack Header:标识PS流的开始,包含时间戳等信息。
-
System Header:包含系统层信息,如缓冲区大小等。
-
Program Stream Map (PSM):描述包含的流(例如视频、音频)的类型和PID。
-
PES Packet:每个PES包包含实际的媒体数据,如视频或音频流。PES包是我们需要解析的重点。
其中,PES Packet可能有多个,每个PES包中可能包含视频(H.264)、音频或其他数据。
解析过程概述
-
查找Pack Header:确认PS流的开始。
-
解析System Header:获取系统相关信息(可选)。
-
解析Program Stream Map:确定视频流的类型和PID(可能为H.264)。
-
解析PES Packet:查找包含H.264数据的PES包,并从中提取H.264裸流。
-
处理NALU:将提取出的H.264数据保存为裸流文件。
解析步骤详细说明
1. 查找Pack Header
PS流的开头是Pack Header,通常以0x000001BA为标志。解析这个头部可以确认PS流的开始位置。
2. 解析System Header (可选)
System Header通常跟在Pack Header之后,以0x000001BB为标志。它包含一些系统层的信息,如缓冲区大小等。这个部分对于解析H.264数据并不是必须的,所以可以选择跳过。
3. 解析Program Stream Map (PSM)
PSM以0x000001BC为标志,描述了PS流中包含的各个流的类型和PID。在这里,找到H.264视频流的类型(通常为0x1B)。
4. 解析PES Packet
PES Packet以到0x000001EF之间的标志开头(E0代表视频流)。每个PES包都有一个头部,头部之后是视频数据。跳过PES包头部后,直接提取视频数据部分。
5. 处理H.264 NALU单元
H.264数据由NALU单元组成,每个NALU单元以0x000001或0x00000001起始码开头。在PES包的有效载荷部分查找这些起始码,并将其提取出来。