聲明:
這裏主要介紹FFmpeg 中mpegts這個封裝格式,希望可以對大家有所幫助。
介紹:
mpegts : 對應的是封裝層代碼,在解碼過程中對應的是下面的解封裝。經過解封裝之後,獲得音視頻對應的es數據。
我們看電視的時候之所以可以每次切臺都可以接着看,而DVD換碟片就要重頭開始看,這是因爲電視在切臺後會發送PAT和PMT。通過PAT我們可以確定PMT的pid,同時接收有與之pid匹配的PMT,而通過PMT我們可以知道將要獲得的音視頻的pid。之後我們接收與PMT中相對應的pid的音視頻數據。而對於一些不規範的服務器會在正常播放的時候改變pid或者音視頻的格式,這個時候就會出現播放卡住的現象。這個時候我們可以通過抓取網絡包,同時從網絡包中提取卡住前後的ts切片對比就可以了。
TS ---------》 PES------------》ES 他們關係如下圖:
TS:
而說到mpegts就要介紹ts的格式。如下圖:
開始的一個字節爲同步字節,對於ts包來說是以0x47開始的。
之後一個字節中的第二位用來標識是不是開始標識,而對於PES來說proload unit start indicator用來標識是不是PES的其實位置,對於每個PES這個標識位都會設置爲1.
而之後的PID佔用了13位。他用來標識不同的pid。PAT一般對應的pid爲0x0,而在PAT中會指明PMT的pid。而解析完PMT的時候,他也會指明對應接收的音視頻的pid。而之後接收的ts包中就是根據這個PID來區分音視頻,並從中取出對應的數據放到PES的數據中。
transport scrambling control標識位一般用來標識加密使用。
在ts包中,proload 區可能是數據,也有可能不是數據,當不是數據的時候就需要adaptation field來填充0xff來,而區分是否有adaptation field 就要看 adaptation field control 這個標識位了。而對於PAT和PMT來說是沒有adaptation field 的。同時可以通過adaptation field control爲不同的值來區分proload中爲什麼樣的值。
- 0x1 : proload爲純數據(爲音視頻數據)
- 0x2 : 爲adaptation field數據,
- 0x3 : 既有音視頻數據又有adaptation field數據。
而如果有adaptation數據,我們可以通過ts包的第5字節來獲取adaptation field的長度。而adaptation field其他的部分需要繼續分析標誌位。這裏還沒有詳細看。
PES:
而當ts包中adaptation field control爲0x1或者0x3時,表示有數據,而這個時候的數據爲PES數據。通常情況下adaptation field control爲0x1,而在PES首個包或者最後一個包的時候,adaptation field control可能爲0x3. 而解析PE數據需要看下面的結構體:
在PES包頭的三個字節爲PES的起始碼標誌,對於PES來說爲0x00 00 01
之後的第四字節 stream id 爲數據流識別:這個時候通常使用這個id來表示是視頻流還是音頻流或者是其他的流。
之後的第五字節和第六字節 PES Packet Length 表示了PES的包長。
之後的兩個字節,第七和第八字節是PES包頭的識別標誌,其中包括:
- 10 的開始表示
- 是否 PES加擾控制(加密傳輸),
- 數據對齊指示
- 版權
- pts/dts標誌位:通過獲得dts和pts來獲得解碼順序和顯示順序。
- 再之後的一個字節包含了PES的包頭長度。
- 而之後的區域就是各種信息區,其中有包括pts ,dts等的信息
而PES其實就是將ES數據打包,而PES的數據部分就是ES數據了。而通過mpegts 我們可以分析ts包頭來獲得各種組成PES需要的數據,而同時將ts包中數據的部分放到PES包中。同樣對於PES的分析可以獲得關於ES的各種數據,而之後將PES數據部分提取出來就是我們需要的音視頻數據了。而從ts包到es數據,這個過程就是一個解複用的過程。
同時強烈建議:
上面這些需要結合mpegts.c的代碼來看。
參考文章:
多媒體文件格式(四):TS 格式 https://www.cnblogs.com/renhui/p/10362640.html
流媒體基礎知識(二) mpegts詳解 https://blog.csdn.net/WangZekun_wolf/article/details/89532912
ffmpeg--mpegts.c解析PES https://blog.csdn.net/evsqiezi/article/details/79625619
MPEG-2系統中ES,PES,PS以及TS流的介紹 https://blog.csdn.net/leopard21/article/details/24818715
mpeg-ts詳細介紹 https://wenku.baidu.com/view/8f9c316caf1ffc4ffe47acae.html
上面這些需要結合mpegts.c的代碼來看。