日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

hls之m3u8、ts流格式详解

發(fā)布時(shí)間:2024/2/28 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hls之m3u8、ts流格式详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

HLSHttp?Live?Streaming?是由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)一次。

#EXTINF:描述單個(gè)媒體文件的長(zhǎng)度。后面為媒體文件,如./0.ts?

?

2、ts文件

??? ts文件為傳輸流文件,視頻編碼主要格式h264/mpeg4,音頻為acc/MP3。

???ts文件分為三層:ts層Transport Stream、pes層 Packet Elemental Stream、es層 Elementary Stream. es層就是音視頻數(shù)據(jù),pes層是在音視頻數(shù)據(jù)上加了時(shí)間戳等對(duì)數(shù)據(jù)幀的說(shuō)明信息,ts層就是在pes層加入數(shù)據(jù)流的識(shí)別和傳輸必須的信息

注: 詳解如下

?(1)ts層??? ?ts包大小固定為188字節(jié),ts層分為三個(gè)部分:ts header、adaptation field、payload。ts header固定4個(gè)字節(jié);adaptation field可能存在也可能不存在,主要作用是給不足188字節(jié)的數(shù)據(jù)做填充;payload是pes數(shù)據(jù)。

ts header

sync_byte8b同步字節(jié),固定為0x47
transport_error_indicator1b傳輸錯(cuò)誤指示符,表明在ts頭的adapt域后由一個(gè)無(wú)用字節(jié),通常都為0,這個(gè)字節(jié)算在adapt域長(zhǎng)度內(nèi)
payload_unit_start_indicator1b負(fù)載單元起始標(biāo)示符,一個(gè)完整的數(shù)據(jù)包開(kāi)始時(shí)標(biāo)記為1
transport_priority1b傳輸優(yōu)先級(jí),0為低優(yōu)先級(jí),1為高優(yōu)先級(jí),通常取0
pid13bpid值
transport_scrambling_control2b傳輸加擾控制,00表示未加密
adaptation_field_control2b是否包含自適應(yīng)區(qū),‘00’保留;‘01’為無(wú)自適應(yīng)域,僅含有效負(fù)載;‘10’為僅含自適應(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值固定為0。PAT表和PMT表需要定期插入ts流,因?yàn)橛脩綦S時(shí)可能加入ts流,這個(gè)間隔比較小,通常每隔幾個(gè)視頻幀就要加入PAT和PMT。PAT和PMT表是必須的,還可以加入其它表如SDT(業(yè)務(wù)描述表)等,不過(guò)hls流只要有PAT和PMT就可以播放了。

  • PAT表:他主要的作用就是指明了PMT表的PID值。

  • PMT表:他主要的作用就是指明了音視頻流的PID值。

  • 音頻流/視頻流:承載音視頻內(nèi)容。

adaption

adaptation_field_length1B自適應(yīng)域長(zhǎng)度,后面的字節(jié)數(shù)
flag1B取0x50表示包含PCR或0x40表示不包含PCR
PCR5BProgram Clock Reference,節(jié)目時(shí)鐘參考,用于恢復(fù)出與編碼端一致的系統(tǒng)時(shí)序時(shí)鐘STC(System Time Clock)。
stuffing_bytesxB填充字節(jié),取值0xff

? ? ?自適應(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)有adaptation field的,不夠的長(zhǎng)度直接補(bǔ)0xff即可。視頻流和音頻流都需要加adaptation field,通常加在一個(gè)幀的第一個(gè)ts包和最后一個(gè)ts包里,中間的ts包不加。

PAT格式

table_id8bPAT表固定為0x00
section_syntax_indicator1b固定為1
zero1b固定為0
reserved2b固定為11
section_length12b后面數(shù)據(jù)的長(zhǎng)度
transport_stream_id16b傳輸流ID,固定為0x0001
reserved2b固定為11
version_number5b版本號(hào),固定為00000,如果PAT有變化則版本號(hào)加1
current_next_indicator1b固定為1,表示這個(gè)PAT表可以用,如果為0則要等待下一個(gè)PAT表
section_number8b固定為0x00
last_section_number8b固定為0x00
開(kāi)始循環(huán)??
program_number16b節(jié)目號(hào)為0x0000時(shí)表示這是NIT,節(jié)目號(hào)為0x0001時(shí),表示這是PMT
reserved3b固定為111
PID13b節(jié)目號(hào)對(duì)應(yīng)內(nèi)容的PID值
結(jié)束循環(huán)??
CRC3232b前面數(shù)據(jù)的CRC32校驗(yàn)碼

PMT格式

table_id8bPMT表取值隨意,0x02
section_syntax_indicator1b固定為1
zero1b固定為0
reserved2b固定為11
section_length12b后面數(shù)據(jù)的長(zhǎng)度
program_number16b頻道號(hào)碼,表示當(dāng)前的PMT關(guān)聯(lián)到的頻道,取值0x0001
reserved2b固定為11
version_number5b版本號(hào),固定為00000,如果PAT有變化則版本號(hào)加1
current_next_indicator1b固定為1
section_number8b固定為0x00
last_section_number8b固定為0x00
reserved3b固定為111
PCR_PID13bPCR(節(jié)目參考時(shí)鐘)所在TS分組的PID,指定為視頻PID
reserved4b固定為1111
program_info_length12b節(jié)目描述信息,指定為0x000表示沒(méi)有
開(kāi)始循環(huán)??
stream_type8b流類型,標(biāo)志是Video還是Audio還是其他數(shù)據(jù),h.264編碼對(duì)應(yīng)0x1b,aac編碼對(duì)應(yīng)0x0f,mp3編碼對(duì)應(yīng)0x03
reserved3b固定為111
elementary_PID13b與stream_type對(duì)應(yīng)的PID
reserved4b固定為1111
ES_info_length12b描述信息,指定為0x000表示沒(méi)有
結(jié)束循環(huán)??
CRC3232b前面數(shù)據(jù)的CRC32校驗(yàn)碼


(2)pes層

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

pes start code3B開(kāi)始碼,固定為0x000001
stream id1B音頻取值(0xc0-0xdf),通常為0xc0
視頻取值(0xe0-0xef),通常為0xe0
pes packet length2B后面pes數(shù)據(jù)的長(zhǎng)度,0表示長(zhǎng)度不限制,
只有視頻數(shù)據(jù)長(zhǎng)度會(huì)超過(guò)0xffff
flag1B通常取值0x80,表示數(shù)據(jù)不加密、無(wú)優(yōu)先級(jí)、備份的數(shù)據(jù)
flag1B取值0x80表示只含有pts,取值0xc0表示含有pts和dts
pes data length1B后面數(shù)據(jù)的長(zhǎng)度,取值5或10
pts5B33bit值
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)單,初始值 + 增量即可,pts計(jì)算比較復(fù)雜,需要在dts的基礎(chǔ)上加偏移量。

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

舉例說(shuō)明:

? ? ? ? ? ? ? ? ? ? ? ? ?I ? ? ? ? ?P ? ? ? ? ?B ? ? ? ? ?B ? ? ? ? ?B ? ? ? ? ?P

讀取順序: ? ? ? ? 1 ? ? ? ? 2 ? ? ? ? ?3 ? ? ? ? ?4 ? ? ? ? ?5 ? ? ? ? ?6

dts順序: ? ? ? ? ? 1 ? ? ? ? 2 ? ? ? ? ?3 ? ? ? ? ?4 ? ? ? ? ?5 ? ? ? ? ?6

pts順序: ? ? ? ? ? 1 ? ? ? ? 5 ? ? ? ? ?3 ? ? ? ? ?2 ? ? ? ? ?4 ? ? ? ? ?6

點(diǎn)播視頻dts算法:

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

pts和dts是以timescale為單位的,1s = 90000 time scale , 一幀就應(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)是每聲道1024個(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(Network Abstraction Layer unit),nalu包括nalu header和nalu type,nalu header固定為0x00000001(幀開(kāi)始)或0x000001(幀中)。h.264的數(shù)據(jù)是由slice組成的,slice的內(nèi)容包括:視頻、sps、pps等。nalu type決定了后面的h.264數(shù)據(jù)內(nèi)容。

F1bforbidden_zero_bit,h.264規(guī)定必須取0
NRI2bnal_ref_idc,取值0~3,指示這個(gè)nalu的重要性,I幀、sps、pps通常取3,P幀通常取2,B幀通常取0
Type5b參考下表

nal_unit_type說(shuō)明
0未使用
1非IDR圖像片,IDR指關(guān)鍵幀
2片分區(qū)A
3片分區(qū)B
4片分區(qū)C
5IDR圖像片,即關(guān)鍵幀
6補(bǔ)充增強(qiáng)信息單元(SEI)
7SPS序列參數(shù)集
8PPS圖像參數(shù)集
9分解符
10序列結(jié)束
11碼流結(jié)束
12填充
13~23保留
24~31未使用

? ? ?紅色字體顯示的內(nèi)容是最常用的,打包es層數(shù)據(jù)時(shí)pes頭和es數(shù)據(jù)之間要加入一個(gè)type=9的nalu,關(guān)鍵幀slice前必須要加入type=7和type=8的nalu,而且是緊鄰。

?

總結(jié)

以上是生活随笔為你收集整理的hls之m3u8、ts流格式详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。