ts流解析規(guī)則_第1頁(yè)
ts流解析規(guī)則_第2頁(yè)
ts流解析規(guī)則_第3頁(yè)
ts流解析規(guī)則_第4頁(yè)
ts流解析規(guī)則_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、HLS,HttpLiveStreaming 是由 Apple 公司定義的用于實(shí)時(shí)流傳輸?shù)膮f(xié)議,HLS 基于 HTTP協(xié)議實(shí)現(xiàn),傳輸內(nèi)容包括兩部分,一是 M3U8 描述文件,二是 TS 媒體文件。1、M3U8 文件用文本方式對(duì)媒體文件進(jìn)行描述,由一系列標(biāo)簽組成。#EXTM3U#EXT-X-TARGETDURATION:5#EXTINF:5,./0.ts#EXTINF:5,./1.ts#EXTM3U:每個(gè) M3U8 文件第一行必須是這個(gè) tag。#EXT-X-TARGETDURATION:指定最大的媒體段時(shí)間長(zhǎng)度(秒),#EXTINF 中指定的時(shí)間長(zhǎng)度必須小于或等于這個(gè)最大值。該值只能出現(xiàn)一次。#

2、EXTINF:描述單個(gè)媒體文件的長(zhǎng)度。后面為媒體文件,如./0.ts2、ts 文件ts 文件為傳輸流文件,視頻編碼主要格式 h264/mpeg4,音頻為 acc/MP3。ts 文件分為三層:ts 層 TransportStream、pes 層 PacketElementalStreames 層ElementaryStream.es 層就是音視頻數(shù)據(jù),pes 層是在音視頻數(shù)據(jù)上加了時(shí)間戳等對(duì)數(shù)據(jù)幀的說(shuō)明信息,ts 層就是在 pes 層加入數(shù)據(jù)流的識(shí)別和傳輸必須的信息ts層tsheader(4byte)adaptationfield(xbyte)payload(184-xbyte)注:詳解如下(1

3、)ts層 ts包大小固定為 188字節(jié), ts層分為三個(gè)部分: tsheaderadaptationfieldpayload0tsheader固定 4 個(gè)字節(jié);adaptationfield 可能存在也可能不存在,主要作用是給不足 188 字節(jié)的數(shù)據(jù)做填充;payload 是 pes 數(shù)據(jù)。tsheadersync_byte8b同步字節(jié),固定為 0 x47transport_error_indicator1b傳輸錯(cuò)誤指示符, 表明在 ts頭的 adapt域后由一個(gè)無(wú)用字節(jié),通常都為 0,這個(gè)字節(jié)算在 adapt 域長(zhǎng)度內(nèi)payload_unit_start_indicator1b負(fù)載單元起始標(biāo)

4、示符,一個(gè)完整的數(shù)據(jù)包開始時(shí)標(biāo)記為 1transport_priority1b傳輸優(yōu)先級(jí),0 為低優(yōu)先級(jí),1 為高優(yōu)先級(jí),通常取0pes層pesheaderoptionalpesheaderpespayload(6byte)(xbyte)nalheader(4byte)naltype(1byte)h264data(xbyte)adtsheader(7byte)aacdata(xbyte)(xbyte)pid13bpid 值transport_scrambling_control2b傳輸加擾控制,00 表示未加密adaptation_field_control2b是否包含自適應(yīng)區(qū),0 蛛留;0

5、偽無(wú)自適應(yīng)域,僅含有效負(fù)載;1 的僅含自適應(yīng)域,無(wú)有效負(fù)載;11 為同時(shí)帶有自適應(yīng)域和有效負(fù)載。continuity_counter4b遞增計(jì)數(shù)器,從 0-f,起始值不一定取 0,但必須是連續(xù)的ts 層的內(nèi)容是通過(guò) PID 值來(lái)標(biāo)識(shí)的,主要內(nèi)容包括:PAT 表、PMT 表、音頻流、視頻流。解析ts 流要先找到 PAT 表, 只要找到 PAT 就可以找到 PMT,然后就可以找到音視頻流了。 PAT 表的 PID值固定為 00PAT 表和 PMT 表需要定期插入 ts 流,因?yàn)橛脩綦S時(shí)可能加入 ts 流,這個(gè)間隔比較小,通常每隔幾個(gè)視頻幀就要加入 PAT 和 PMT。PAT 和 PMT 表是必須的

6、,還可以加入其它表如 SDT(業(yè)務(wù)描述表)等,不過(guò) hls 流只要有 PAT 和 PMT 就可以播放了。PAT 表:他主要的作用就是指明了 PMT 表的 PID 值PMT 表:他主要的作用就是指明了音視頻流的 PID 值音頻流/視頻流:承載音視頻內(nèi)容。adaptionadaptation_field_length1B自適應(yīng)域長(zhǎng)度,后面的字節(jié)數(shù)flag1B取 0 x50 表示包含 PCR 或 0 x40 表示不包含 PCRProgramClockReference,節(jié)目時(shí)鐘參考,用于恢復(fù)出與PCR5B編碼端一致的系統(tǒng)時(shí)序時(shí)鐘 STC(SystemTimeClock)。stuffing_bytes

7、xB 填充字節(jié),取值 0 xff自適應(yīng)區(qū)的長(zhǎng)度要包含傳輸錯(cuò)誤指示符標(biāo)識(shí)的一個(gè)字節(jié)。pcr 是節(jié)目時(shí)鐘參考,pcr、dts、pts 都是對(duì)同一個(gè)系統(tǒng)時(shí)鐘的采樣值,pcr 是遞增的,因此可以將其設(shè)置為 dts 值,音頻數(shù)據(jù)不需要 pcr。 如果沒(méi)有字段, ipad 是可以播放的, 但 vlc 無(wú)法播放。 打包 ts 流時(shí) PAT 和 PMT表是沒(méi)有 adaptationfield的, 不夠的長(zhǎng)度直接補(bǔ) 0 xff即可。 視頻流和音頻流都需要加 adaptationfield,通常加在一個(gè)幀的第一個(gè) ts 包和最后一個(gè) ts 包里,中間的 ts 包不加。TSHeadPAT/PMTStuffingBy

8、tesTSHeadAdaptationFieldPes1TSHeadPes2-Pes(NdJTSHeadAdaptationFieldPesNPAT 格式table_id8bPAT 表固定為 0 x00section_syntax_indicator1b固定為 1zero1b固定為 0reserved2b固定為 11section_length12b后面數(shù)據(jù)的長(zhǎng)度transport_stream_id16b傳輸流 ID,固定為 0 x0001reserved2b固定為 11version_number5b版本號(hào),固定為 00000,如果 PAT 有變化則版本號(hào)加 1current_next_i

9、ndicator1b固定為 1,表示這個(gè) PAT 表可以用,如果為 0 則要等待下一個(gè) PAT 表section_number8b固定為 0 x00last_section_number8b固定為 0 x00開始循環(huán)program_number16b節(jié)目號(hào)為 0 x0000 時(shí)表 7K 這是 NIT,節(jié)目號(hào)為 0 x0001 時(shí),表示這是 PMTreserved3b固定為 111PID13b節(jié)目號(hào)對(duì)應(yīng)內(nèi)容的 PID 值結(jié)束循環(huán)CRC3232b前面數(shù)據(jù)的 CRC32 校驗(yàn)碼PMT 格式table_id8bPMT 表取值隨意,0 x02section_syntax_indicator1b固定為 1

10、zero1b固定為 0reserved2b固定為 11section_length12b后面數(shù)據(jù)的長(zhǎng)度program_number16b頻道號(hào)碼,表示當(dāng)前的 PMT 關(guān)聯(lián)到的頻道,取值 0 x0001reserved2b固定為 11version_number5b版本號(hào),固定為 00000,如果 PAT 有變化則版本號(hào)加 1current_next_indicator1b固定為 1section_number8b固定為 0 x00last_section_number8b固定為 0 x00reserved3b固定為 111PCR_PID13bPCR(節(jié)目參考時(shí)鐘)所在 TS 分組的 PID,指

11、定為視頻 PIDreserved4b固定為 1111program_info_length12b節(jié)目描述信息,指定為 0 x000 表示沒(méi)有開始循環(huán)stream_type8b流類型,標(biāo)志是 Video 還是 Audio 還是其他數(shù)據(jù),h.264編碼對(duì)應(yīng) 0 x1b,aac 編碼對(duì)應(yīng) 0 x0f,mp3 編碼對(duì)應(yīng) 0 x03reserved3b固定為 111elementary_PID13b與 stream_type 對(duì)應(yīng)的 PIDreserved4b固定為 1111ES_info_length12b描述信息,指定為 0 x000 表示沒(méi)有結(jié)束循環(huán)CRC3232b前面數(shù)據(jù)的 CRC32 校驗(yàn)碼(

12、2) pes 層pes 層是在每一個(gè)視頻/音頻幀上加入了時(shí)間戳等信息,pes 包內(nèi)容很多,我們只留下最常用的。PesHeader闡OptionalPesHeader(3B-259B)Payload1最大65526B)pesstartcode3B開始碼,固定為 0 x000001streamid1B首頻取值(0 xc0-0 xdf),通常為 0 xc0視頻取值(0 xe0-0 xef),通常為 0 xe0pespacketlength2B后面 pes 數(shù)據(jù)的長(zhǎng)度,0 表示長(zhǎng)度不限制,只有視頻數(shù)據(jù)長(zhǎng)度會(huì)超過(guò) 0 xffffflag1B通常取值 0 x80,表示數(shù)據(jù)不加密、無(wú)優(yōu)先級(jí)、備份的數(shù)據(jù)fla

13、g1B取值 0 x80 表 7K 只含有 pts,取值 0 xc0 表 7K 含有 pts 和 dtspesdatalength1B后面數(shù)據(jù)的長(zhǎng)度,取值 5 或 10pts5B33bit 值dts5B33bit 值pts 是顯示時(shí)間戳、 dts 是解碼時(shí)間戳, 視頻數(shù)據(jù)兩種時(shí)間戳都需要, 音頻數(shù)據(jù)的 pts 和 dts 相同,所以只需要 pts。有 pts 和 dts 兩種時(shí)間戳是 B 幀引起的,I 幀和 P 幀的 pts 等于 dts。如果一個(gè)視頻沒(méi)有 B 幀,則 pts 永遠(yuǎn)和 dts 相同。從文件中順序讀取視頻幀,取出的幀順序和 dts 順序相同。dts算法比較簡(jiǎn)單,初始值+增量即可,p

14、ts 計(jì)算比較復(fù)雜,需要在 dts 的基礎(chǔ)上加偏移量。音頻的 pes 中只有 pts(同 dts),視頻的 I、P 幀兩種時(shí)間戳都要有,視頻 B 幀只要 pts(同 dts)o 打包 pts 和 dts 就需要知道視頻幀類型,但是通過(guò)容器格式我們是無(wú)法判斷幀類型的,必須解析h.264 內(nèi)容才可以獲取幀類型。舉例說(shuō)明:IPBBBP讀取順序:123456dts 順序:123456pts 順序:153246點(diǎn)播視頻 dts 算法:dts=初始值+90000/video_frame_rate,初始值可以隨便指定,但是最好不要取 0,video_frame_rate就是幀率,比如 23、30。pts 和

15、 dts 是以 timescale 為單位的, 1s=90000timescale,一幀就應(yīng)該是 90000/video_frame_rate 個(gè)timescale。用一幀的 timescale 除以采樣頻率就可以轉(zhuǎn)換為一幀的播放時(shí)長(zhǎng)點(diǎn)播音頻 dts 算法:dts=初始值+(90000*audio_samples_per_frame)/audio_sample_rate,audio_samples_per_frame這個(gè)值與編解碼相關(guān),aac 取值 1024,mp3 取值 1158,audio_sample_rate 是采樣率,比如 24000、41000。 AAC 一幀解碼出來(lái)是每聲道 10

16、24 個(gè) sample,也就是說(shuō)一幀的時(shí)長(zhǎng)為 1024/sample_rate 秒。所以每一幀時(shí)間戳依次 0,1024/sample_rate,.,1024*n/sample_rate 秒。直播視頻的 dts 和 pts 應(yīng)該直接用直播數(shù)據(jù)流中的時(shí)間,不應(yīng)該按公式計(jì)算。(3) es 層es 層指的就是音視頻數(shù)據(jù),我們只介紹 h.264 視頻和 aac 音頻。h.264 視頻:打包 h.264 數(shù)據(jù)我們必須給視頻數(shù)據(jù)加上一個(gè) nalu(NetworkAbstractionLayerunit) ,nalu包括naluheader和nalutype,naluheader固定為0 x00000001

17、(幀開始) 或0 x000001(幀中)。h.264 的數(shù)據(jù)是由 slice 組成的,slice 的內(nèi)容包括:視頻、sps、pps 等。nalutype 決定了后面的 h.264 數(shù)據(jù)內(nèi)容。廣一=7-*|0|1|2|3|4|5|6|7|+-+-+-+-1-+-+|F|NRI|Type|F1bforbidden_zero_bit,h.264 規(guī)定必須取 0nal_ref_idc,取值 03,指示這個(gè) nalu 的重要性,I 幀、sps、pps 通常取 3,NRI2b 一一P 幀通常取 2,B 幀通常取 0Type5b 參考下表nal_unit_type說(shuō)明0未使用1非 IDR 圖像片,IDR 指

18、關(guān)鍵幀2片分區(qū) A3片分區(qū) B4片分區(qū) C5IDR 圖像片,即關(guān)鍵幀6補(bǔ)充增強(qiáng)信息單元(SEI)7SPS 序列參數(shù)集8PPS 圖像參數(shù)集9分解符10序列結(jié)束11碼流結(jié)束12填充1323保留2431未使用紅色字體顯示的內(nèi)容是最常用的,打包 es 層數(shù)據(jù)時(shí) pes 頭和 es 數(shù)據(jù)之間要加入一個(gè) type=9的 nalu,關(guān)鍵幀 slice 前必須要加入 type=7 和 type=8 的 nalu,而且是緊鄰。PesHeadnalu(0 x09)曲意曲意(1BInalu但他)內(nèi)容內(nèi)容nalu(0 x41)內(nèi)容內(nèi)容一、背景介紹之前我做了一個(gè)項(xiàng)目,要求寫一個(gè)TS流解析的模塊,因此看了ISOIEC13

19、818-1文檔,外加很多人的博客來(lái)幫助理解,來(lái)了解TS流格式是個(gè)什么東西,收貨頗多。因此我覺得是時(shí)候發(fā)點(diǎn)干貨回饋社會(huì)了。二,TS流背景介紹在介紹具體字段,參數(shù)這些頭疼,煩人的東西之前,我覺得有必要先介紹下TS流的應(yīng)用背景,有了這個(gè)概念,再去深入學(xué)習(xí),將如虎添翼。TS流最經(jīng)典的應(yīng)用就是我們平時(shí)生活中的數(shù)字高清電視。 我們看的電視碼流就是TS封裝格式PesHeadnalu(0 x09)隨意隨意(1B)nalu慎他)內(nèi)容內(nèi)容nalu(0 x67)內(nèi)容內(nèi)容nalu(0 x68)內(nèi)容內(nèi)容nalu(0 x65)的碼流,電視碼流發(fā)送過(guò)來(lái)后,就會(huì)由我們的機(jī)頂盒進(jìn)行解封裝,解碼,然后傳給電視機(jī)進(jìn)行播放。這里就有

20、一個(gè)問(wèn)題,我們看電視,有很多的頻道,節(jié)目,對(duì)應(yīng)碼流是怎么區(qū)分的呢?(TIPS,頻道和節(jié)目的關(guān)系,比如我們有中央電視臺(tái)綜合頻道,下屬CCTV-1CCTV14這些節(jié)目)TS流引入了PAT和PMT兩張表格的概念來(lái)解決這個(gè)問(wèn)題。三,PAT和PMTTS流是以每188字節(jié)為一包,我們可以稱為tspacketo這個(gè)tspacket有可能是音視頻數(shù)據(jù),也有可能是表格。舉例說(shuō)明,TS流的包順序?yàn)椋篜AT,PMT,DATA,DATAPAT,PMT,DATA,DATA每隔一段時(shí)間,發(fā)送一張PAT表,緊接著發(fā)送一張PMT表,接著發(fā)送DATA(音視頻)數(shù)據(jù)。那么你可能要問(wèn)了,有了這2張表格怎么區(qū)分頻道,節(jié)目呢?PAT表

21、格里面包含所有PMT表格的信息,一個(gè)PMT表格對(duì)應(yīng)一個(gè)頻道,比如中央電視臺(tái)綜合頻道。而一個(gè)PMT里面包含所有節(jié)目的信息,比如CCTV1CCTV14。在實(shí)際情況中我們是有很多頻道的,所以PMT表格可不止一張,有可能是PAT,PMT,PMT,PMT,DATA,DATA,PAT,PMT,PMT,DATA,DATA這樣的形式。除了這個(gè)設(shè)定外,每個(gè)頻道或節(jié)目都有自己的標(biāo)識(shí)符(PID),這樣當(dāng)我們拿到一個(gè)DATA,解析出里面的PID,就知道是什么節(jié)目, 并且也知道所屬頻道是什么了。我們看電視的時(shí)候,會(huì)收到所有節(jié)目的DATA,當(dāng)我們正在看某個(gè)節(jié)目的時(shí)候,機(jī)頂盒會(huì)把這個(gè)節(jié)目的DATA單獨(dú)過(guò)濾出來(lái),其它的舍棄。四,tspacket格式講解tspacket我們知道一包是188字節(jié),它分為tsheader和tsbody。其中tsheader里面會(huì)有個(gè)PID字段標(biāo)識(shí)著當(dāng)前tsbody的類型。tsbody有可能是表格,也有可能是DATA,表格沒(méi)什么好說(shuō)的,我們說(shuō)下DATA的結(jié)構(gòu)。DATA包其

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論