要從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包的有效載荷部分查找這些起始碼,并將其提取出來。