FMUSER更輕鬆地傳輸視頻和音頻!
es.fmuser.org
it.fmuser.org
fr.fmuser.org
de.fmuser.org
af.fmuser.org ->荷蘭語
sq.fmuser.org ->阿爾巴尼亞人
ar.fmuser.org ->阿拉伯語
hy.fmuser.org - >亞美尼亞
az.fmuser.org ->阿塞拜疆
eu.fmuser.org ->巴斯克
be.fmuser.org ->白俄羅斯語
bg.fmuser.org - >保加利亞
ca.fmuser.org ->加泰羅尼亞語
zh-CN.fmuser.org ->中文(簡體)
zh-TW.fmuser.org - >中國(繁體)
hr.fmuser.org ->克羅地亞語
cs.fmuser.org ->捷克
da.fmuser.org ->丹麥語
nl.fmuser.org - >荷蘭
et.fmuser.org ->愛沙尼亞語
tl.fmuser.org ->菲律賓
fi.fmuser.org ->芬蘭語
fr.fmuser.org - >法國
gl.fmuser.org ->加利西亞語
ka.fmuser.org ->喬治亞
de.fmuser.org ->德語
el.fmuser.org - >希臘
ht.fmuser.org ->海地克里奧爾語
iw.fmuser.org ->希伯來語
hi.fmuser.org ->印地語
hu.fmuser.org - >匈牙利
is.fmuser.org ->冰島語
id.fmuser.org ->印尼語
ga.fmuser.org ->愛爾蘭
it.fmuser.org - >意大利
ja.fmuser.org ->日語
ko.fmuser.org ->韓文
lv.fmuser.org ->拉脫維亞
lt.fmuser.org - >立陶宛
mk.fmuser.org ->馬其頓語
ms.fmuser.org ->馬來語
mt.fmuser.org ->馬耳他語
no.fmuser.org - >挪威
fa.fmuser.org ->波斯語
pl.fmuser.org ->波蘭語
pt.fmuser.org ->葡萄牙語
ro.fmuser.org - >羅馬尼亞
ru.fmuser.org ->俄語
sr.fmuser.org ->塞爾維亞語
sk.fmuser.org ->斯洛伐克
sl.fmuser.org - >斯洛文尼亞
es.fmuser.org ->西班牙語
sw.fmuser.org ->斯瓦希里語
sv.fmuser.org ->瑞典語
th.fmuser.org - >泰國
tr.fmuser.org ->土耳其語
uk.fmuser.org ->烏克蘭語
ur.fmuser.org ->烏爾都語
vi.fmuser.org - >越南
cy.fmuser.org ->威爾士語
yi.fmuser.org - >意第緒語
HLS和Http Live Streaming是Apple定義的用於實時流傳輸的協議。 HLS是基於HTTP協議實現的。 傳輸內容包括兩部分,一個是M3U8描述文件,另一個是TS媒體文件。
1. M3U8文件
媒體文件以文本形式描述,該文本由一系列標籤組成。
#EXTM3U
#EXT-X-TARGETDURATION:5
#EXTINF:5,
./0.ts
#EXTINF:5,
./1.ts
#EXTM3U:每個M3U8文件的第一行必須是此標記。
#EXT-X-TARGETDURATION:指定最大媒體段時間長度(秒)。 #EXTINF中指定的時間長度必須小於或等於此最大值。 該值只能出現一次。
#EXTINF:描述單個媒體文件的長度。 隨後是媒體文件,例如./0.ts
2. ts文件
ts文件是傳輸流文件,主要視頻編碼格式是h264 / mpeg4,音頻是acc / MP3。
ts文件分為三層:ts層傳輸流,pes層分組元素流,es層元素流。 es層是音頻和視頻數據,而pes層是數據幀描述信息,例如添加到音頻和視頻數據的時間戳。 ts層將添加必要的信息,以在pes層中識別和傳輸數據流
注意:詳細信息如下
(1)ts層ts數據包的大小固定為188字節,並且ts層分為三部分:ts頭,適配字段和有效負載。 ts標頭固定為4個字節; 適配字段可以存在或不存在,其主要功能是填充小於188字節的數據; 有效負載是pes數據。
ts標頭
sync_byte 8b同步字節,固定為0x47
transport_error_indicator 1b傳輸錯誤指示符,指示ts標頭的Adapt字段後有一個無用的字節,通常為0,此字節計入Adapt字段的長度
payload_unit_start_indicator 1b加載單元啟動指示符,在完整數據包的開始處標記為1
transport_priority 1b傳輸優先級,0為低優先級,1為高優先級,通常為0
pid 13b pid值
transport_scrambling_control 2b傳輸加擾控制,00表示未加密
adaptive_field_control 2b是否包括適配字段,保留'00'; “ 01”表示沒有適應字段,只有有效負載; “ 10”僅表示自適應字段,無有效載荷; “ 11”表示還包括域和有效負載。
continuity_counter 4b從0-f遞增計數器,起始值不一定取0,但必須是連續的
ts層的內容由PID值標識,主要內容包括:PAT表,PMT表,音頻流和視頻流。 要解析ts流,首先必須找到PAT表,只要找到PAT,就可以找到PMT,然後才能找到音頻和視頻流。 PAT表的PID值固定為0。PAT表和PMT表需要定期插入ts流中,因為用戶可以隨時加入ts流,所以間隔比較小,通常每隔幾個視頻幀以添加PAT和PMT。 PAT和PMT表是必需的,還可以添加其他表,例如SDT(服務描述表),但是只要有PAT和PMT,就可以播放hls流。
PAT表:其主要功能是指示PMT表的PID值。
PMT表:其主要功能是指定音頻和視頻流的PID值。
音頻流/視頻流:承載音頻和視頻內容。
適應性
Adapt_field_length 1B自適應字段的長度,後面的字節數
標誌1B使用0x50表示PCR或0x40不包括PCR
PCR 5B程序時鐘參考,程序時鐘參考,用於恢復與編碼器一致的系統定時時鐘STC(系統時間時鐘)。
stuffing_bytes xB填充字節,值為0xff
適配區的長度應包括一個由傳輸錯誤指示符標識的字節。 pcr是程序時鐘參考,pcr,dts,pts都是同一系統時鐘的採樣值,pcr是增量的,因此可以將其設置為dts值,音頻數據不需要pcr。 如果沒有字段,則ipad可以播放,但vlc無法播放。 打包ts流時,PAT和PMT表沒有適應字段。 如果長度不夠,只需填寫0xff。 視頻流和音頻流都需要添加適配字段,通常將其添加到幀的第一個ts數據包和最後一個ts數據包中,並且不添加中間的ts數據包。
PAT格式
table_id 8b PAT表固定為0x00
section_syntax_indicator 1b固定為1
零1b固定為0
保留2b固定為11
section_length 12b以下數據的長度
transport_stream_id 16b傳輸流ID,固定為0x0001
保留2b固定為11
version_number 5b版本號,固定為00000,如果PAT更改,則版本號將增加1
current_next_indicator 1b固定為1,表示可以使用該PAT表,如果為0,則等待下一個PAT表
section_number 8b固定為0x00
last_section_number 8b固定為0x00
啟動循環
program_number 16b當程序號為0x0000時,表示為NIT;當程序號為0x0001時,表示為PMT。
保留3b固定為111
PID 13b PID值對應於程序編號的內容
結束循環
CRC32 32b先前數據的CRC32校驗碼
PMT格式
table_id 8b PMT表具有任何值0x02
section_syntax_indicator 1b固定為1
零1b固定為0
保留2b固定為11
section_length 12b以下數據的長度
program_number 16b通道號,表示與當前PMT關聯的通道,值為0x0001
保留2b固定為11
version_number 5b版本號,固定為00000,如果PAT更改,則版本號將增加1
current_next_indicator 1b固定為1
section_number 8b固定為0x00
last_section_number 8b固定為0x00
保留3b固定為111
PCR_PID 13b PCR(程序參考時鐘)所在的TS數據包的PID,指定為視頻PID
保留4b固定為1111
program_info_length 12b程序描述信息,指定為0x000表示否
啟動循環
stream_type 8b流類型,標記是視頻或音頻或其他數據,h.264編碼對應於0x1b,aac編碼對應於0x0f,mp3編碼對應於0x03
保留3b固定為111
對應於stream_type的elementary_PID 13b PID
保留4b固定為1111
ES_info_length 12b描述信息,指定為0x000表示否
結束循環
CRC32 32b先前數據的CRC32校驗碼
(2)PE層
pes層將時間戳和其他信息添加到每個視頻/音頻幀。 pes軟件包包含很多內容,我們只保留最常用的內容。
pes起始代碼3B起始代碼,固定為0x000001
流ID 1B音頻值(0xc0-0xdf),通常為0xc0
視頻值(0xe0-0xef),通常為0xe0
pes數據包長度2B,後面的pes數據長度,0表示無限制長度,
僅視頻數據長度將超過0xffff
標誌1B通常取值為0x80,這表示數據未加密,沒有優先級並且已備份數據
標誌1B的值0x80僅表示pts,值0xc0表示pts和dts
pes data length 1B以下數據的長度,值為5或10
pts 5B 33bit值
dts 5B 33bit值
pts是顯示時間戳,dts是解碼時間戳。 視頻數據需要兩個時間戳。 音頻數據的pts和dts相同,因此僅需要pts。 有兩個時間戳,分別是pts和dts,它們是由B幀引起的。 I和P幀的pt等於dts。 如果視頻沒有B幀,則點數將始終與dts相同。 從文件中順序讀取視頻幀,並且提取的幀的序列與dts序列相同。 dts算法相對簡單,初始值+增量就足夠,pts的計算更為複雜,並且需要將偏移量添加到dts中。
音頻pes中只有pt(與dts相同),視頻的I和P幀必須同時具有時間戳,而視頻B幀僅需要pt(與dts相同)。 要打包pts和dts,您需要了解視頻幀類型,但是我們無法通過容器格式來判斷幀類型。 您必須解析h.264內容以獲取幀類型。
例如:
IPBBBP
閱讀順序:1 2 3 4 5 6
dts順序:1 2 3 4 5 6
點數:1 5 3 2 4 6
點播視頻DTS算法:
dts =初始值+ 90000 / video_frame_rate,可以任意指定初始值,但是最好不要取0,video_frame_rate是幀速率,例如23、30。
pts和dts基於時標,1s = 90000時標,一幀應為90000 / video_frame_rate時標。
將一幀的時間標度除以採樣頻率可轉換為一幀的播放持續時間
點播音頻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個樣本,這意味著一幀的持續時間為1024 / sample_rate秒。 因此,每幀的時間戳為0、1024 / sample_rate,...,1024 * n / sample_rate秒。
實時視頻的dts和pts應該直接使用實時數據流中的時間,並且不應通過公式計算。
(3)es層
es層是指音頻和視頻數據,我們僅介紹h.264視頻和aac音頻。
h.264視頻:
要打包h.264數據,我們必須在視頻數據中添加nalu(網絡抽象層單元)。 nalu包括nalu標頭和nalu類型。 nalu標頭固定為0x00000001(幀的開始)或0x000001(幀內)。 h.264的數據由切片組成,切片的內容包括:視頻,sps,pps等。nalu類型確定後續h.264數據的內容。
F 1b forbidden_zero_bit,h.264規定必須為0
NRI 2b nal_ref_idc,值0〜3,表示該nalu的重要性。I幀,sps,pps通常為3,P幀通常為2,B幀通常為0
5b型參見下表
nal_unit_type說明
0未使用
1個非IDR圖像,IDR指關鍵幀
2片分區A
3片分區B
|
輸入電子郵件以獲取驚喜
es.fmuser.org
it.fmuser.org
fr.fmuser.org
de.fmuser.org
af.fmuser.org ->荷蘭語
sq.fmuser.org ->阿爾巴尼亞人
ar.fmuser.org ->阿拉伯語
hy.fmuser.org - >亞美尼亞
az.fmuser.org ->阿塞拜疆
eu.fmuser.org ->巴斯克
be.fmuser.org ->白俄羅斯語
bg.fmuser.org - >保加利亞
ca.fmuser.org ->加泰羅尼亞語
zh-CN.fmuser.org ->中文(簡體)
zh-TW.fmuser.org - >中國(繁體)
hr.fmuser.org ->克羅地亞語
cs.fmuser.org ->捷克
da.fmuser.org ->丹麥語
nl.fmuser.org - >荷蘭
et.fmuser.org ->愛沙尼亞語
tl.fmuser.org ->菲律賓
fi.fmuser.org ->芬蘭語
fr.fmuser.org - >法國
gl.fmuser.org ->加利西亞語
ka.fmuser.org ->喬治亞
de.fmuser.org ->德語
el.fmuser.org - >希臘
ht.fmuser.org ->海地克里奧爾語
iw.fmuser.org ->希伯來語
hi.fmuser.org ->印地語
hu.fmuser.org - >匈牙利
is.fmuser.org ->冰島語
id.fmuser.org ->印尼語
ga.fmuser.org ->愛爾蘭
it.fmuser.org - >意大利
ja.fmuser.org ->日語
ko.fmuser.org ->韓文
lv.fmuser.org ->拉脫維亞
lt.fmuser.org - >立陶宛
mk.fmuser.org ->馬其頓語
ms.fmuser.org ->馬來語
mt.fmuser.org ->馬耳他語
no.fmuser.org - >挪威
fa.fmuser.org ->波斯語
pl.fmuser.org ->波蘭語
pt.fmuser.org ->葡萄牙語
ro.fmuser.org - >羅馬尼亞
ru.fmuser.org ->俄語
sr.fmuser.org ->塞爾維亞語
sk.fmuser.org ->斯洛伐克
sl.fmuser.org - >斯洛文尼亞
es.fmuser.org ->西班牙語
sw.fmuser.org ->斯瓦希里語
sv.fmuser.org ->瑞典語
th.fmuser.org - >泰國
tr.fmuser.org ->土耳其語
uk.fmuser.org ->烏克蘭語
ur.fmuser.org ->烏爾都語
vi.fmuser.org - >越南
cy.fmuser.org ->威爾士語
yi.fmuser.org - >意第緒語
FMUSER更輕鬆地傳輸視頻和音頻!
聯絡我們
分類
電子通訊