TS流 系列日記(2)TS流的表那些事

說完了TS流的基本概念,就該開始對TS流進行更深入的研究了。首先需要想一想:TS流的本質(zhì)是什么?它的確是一段碼流,并且是一段由數(shù)據(jù)包(Packet)組成的碼流。那么這些數(shù)據(jù)包究竟是怎樣的呢?它和我們收看的電視節(jié)目之間又有什么區(qū)別?這些都是這部分需要了解的內(nèi)容。
在上一節(jié)中,我們可以看到\color{red}{PID}這個被標紅的字段頻繁地出現(xiàn)。\color{red}{PID}是當前TS流的Packet區(qū)別于其他Packet類型的唯一識別符,通過讀取每個包的Packet Header,我們可以知道這個Packet的數(shù)據(jù)屬于何種類型。上一節(jié)列出了幾項固定的\color{red}{PID}值,它們用于識別存儲了特殊信息的Packet。下面要談的PAT表的\color{red}{PID}值就是固定的0x0000。

(一) PAT表(Program Association Table,節(jié)目關聯(lián)表)

  • PAT表定義了當前TS流中所有的節(jié)目,其PID為0x0000,它是PSI的根節(jié)點,要查尋找節(jié)目必須從PAT表開始查找。

  • PAT表攜帶以下信息:


通過一段TS流中一個Packet分析PAT表
這里我們分析一段TS流其中一個Packet的Packet Data部分:
首先給出一個數(shù)據(jù)包,其數(shù)據(jù)如下:


分析Packet Header如下表所示:

根據(jù)包頭數(shù)據(jù)格式,我們可以知曉整個數(shù)據(jù)包的屬性,列表如下:

如上表所示,我們可以知道,首先Packet的Packet Data是PAT信息表,因為其PID為0x0000,并且在包頭后需要除去一個字節(jié)才是有效數(shù)據(jù)(payload_unit_start_indicator="1")。這樣,Packet Data就應該是“00 b0 11 00 01 c1 00 00 00 00 e0 1f 00 01 e1 00 24 ac48 84 ff ff …… ff ff”。

(二) PMT表(Program Map Table,節(jié)目映射表)(Service Descriptor Table)

  1. PMT表的描述
    如果一個TS流中含有多個頻道,那么就會包含多個PID不同的PMT表。
    PMT表中包含的數(shù)據(jù)如下:

(1) 當前頻道中包含的所有Video數(shù)據(jù)的PID
(2) 當前頻道中包含的所有Audio數(shù)據(jù)的PID
(3) 和當前頻道關聯(lián)在一起的其他數(shù)據(jù)的PID(如數(shù)字廣播,數(shù)據(jù)通訊等使用的PID)

只要我們處理了PMT,那么我們就可以獲取頻道中所有的PID信息,如當前頻道包含多少個Video、共多少個Audio和其他數(shù)據(jù),還能知道每種數(shù)據(jù)對應的PID分別是什么。這樣如果我們要選擇其中一個Video和Audio收看,那么只需要把要收看的節(jié)目的Video PID和Audio PID保存起來,在處理Packet的時候進行過濾即可實現(xiàn)。

最后簡單介紹一下PES層

pes層是在每一個視頻/音頻幀上加入了時間戳等信息,pes包內(nèi)容很多,我們只留下最常用的。

pts是顯示時間戳、dts是解碼時間戳,視頻數(shù)據(jù)兩種時間戳都需要,音頻數(shù)據(jù)的pts和dts相同,所以只需要pts。有pts和dts兩種時間戳是B幀引起的,I幀和P幀的pts等于dts。如果一個視頻沒有B幀,則pts永遠和dts相同。從文件中順序讀取視頻幀,取出的幀順序和dts順序相同。dts算法比較簡單,初始值 + 增量即可,pts計算比較復雜,需要在dts的基礎上加偏移量。

音頻的pes中只有pts(同dts),視頻的I、P幀兩種時間戳都要有,視頻B幀只要pts(同dts)。打包pts和dts就需要知道視頻幀類型,但是通過容器格式我們是無法判斷幀類型的,必須解析h.264內(nèi)容才可以獲取幀類型。

舉例說明:

點播視頻dts算法:

dts = 初始值 + 90000 / video_frame_rate,初始值可以隨便指定,但是最好不要取0,video_frame_rate就是幀率,比如23、30。

pts和dts是以timescale為單位的,1s = 90000 time scale , 一幀就應該是90000/video_frame_rate 個timescale。

用一幀的timescale除以采樣頻率就可以轉(zhuǎn)換為一幀的播放時長

點播音頻dts算法:

dts = 初始值 + (90000 * audio_samples_per_frame) / audio_sample_rate,audio_samples_per_frame這個值與編解碼相關,aac取值1024,mp3取值1158,audio_sample_rate是采樣率,比如24000、41000。AAC一幀解碼出來是每聲道1024個sample,也就是說一幀的時長為1024/sample_rate秒。所以每一幀時間戳依次0,1024/sample_rate,...,1024*n/sample_rate秒。

直播視頻的dts和pts應該直接用直播數(shù)據(jù)流中的時間,不應該按公式計算。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 參考【PSI/SI學習系列】第一章:預備知識【PSI/SI學習系列】第二章:從TS到PAT和PMT 最近開始學習數(shù)...
    合肥黑閱讀 6,754評論 0 6
  • 一、TS HEADER 參考TS科普 2 包頭TS流格式學習Ts流解析中難點說明百度文庫 最直白明了的TS流分析 ...
    合肥黑閱讀 4,853評論 0 2
  • 做這個東西很久了,從去年十二月份開始的,快5個月了。。。期間因為工作一直斷斷續(xù)續(xù),直到最近才有了些進展,也就到此為...
    0_0啊閱讀 12,796評論 1 13
  • 教程一:視頻截圖(Tutorial 01: Making Screencaps) 首先我們需要了解視頻文件的一些基...
    90后的思維閱讀 4,980評論 0 3
  • 今天是二十四節(jié)氣中最后一個節(jié)四:大寒??牲S土高原地區(qū)的氣溫在零下10度到零上5度,天并不冷。 天空瓦藍瓦藍的,太陽...
    愛彌閱讀 336評論 0 5

友情鏈接更多精彩內(nèi)容