網(wǎng)站設計聯(lián)盟西安seo學院
?四、封裝篇
H264封裝成mp4、flv等格式,那為什么需要封裝?
? h264也能播放,但是按照幀率進行播放,可能不準
★FLV
**FLV(Flash Video)**是一種用于傳輸和播放視頻的容器文件格式。FLV 格式廣泛應用于流媒體和網(wǎng)頁視頻播放,尤其在 Flash 技術流行時期,是視頻流媒體的標準格式之一。FLV 格式結構簡單、文件體積小,適合網(wǎng)絡傳輸。
特點:
- FLV 作為容器格式,可以封裝視頻、音頻和元數(shù)據(jù)。通常情況下,FLV 中的視頻流編碼為 H.264,音頻流編碼為 AAC 或 MP3。
- FLV 文件體積較小,數(shù)據(jù)流封裝效率高,適合網(wǎng)絡視頻播放,能夠減少延遲,便于在帶寬較低的情況下流暢播放。
- 設計用于流媒體,FLV 文件支持按時間戳分塊封裝,便于播放時隨時從任意位置讀取和加載數(shù)據(jù),增強了網(wǎng)絡流媒體傳輸?shù)姆€(wěn)定性。
- FLV 可支持漸進式下載(Progressive Download),邊下載邊播放
播放過程:在流媒體播放過程中,FLV 文件按照上述標簽順序依次傳輸。播放器讀取并解析文件頭,然后根據(jù)標簽中的時間戳同步音頻和視頻。腳本標簽包含的元數(shù)據(jù)會在播放前提供相關信息,而每個標簽的類型和數(shù)據(jù)大小字段用于解析和播放音視頻內容。
封裝格式
文件頭(Header) + 前一個標簽大小(Previous Tag Size)+ 標簽(Tag)
文件頭(9B)
用于標識文件格式和版本信息
- Signature:固定的三個字節(jié)
FLV
,用于標識這是一個 FLV 文件。 - Version:表示 FLV 的版本,通常為
0x01
。 - Type Flags:指示文件中是否包含音頻(Audio)和視頻(Video)數(shù)據(jù)。
- Data Offset:表示 FLV 文件頭的長度。
FLV Body = Previous Tag Size + Tag
Previous Tag Size : 4 字節(jié)字段,表示前一個標簽的大小。這一字段的作用是便于解析器快速跳到下一個標簽的位置。
Tag = Tag Header + Tag Data
- Tag Type:表示標簽類型(0x08 表示音頻標簽,0x09 表示視頻標簽,0x12 表示腳本/元數(shù)據(jù)標簽)。
- Data Size:表示該標簽的數(shù)據(jù)部分的大小。
- Timestamp:用于同步音視頻的時間戳。對于視頻文件,這個時間戳決定了標簽在播放中的位置。
- Stream ID:流標識,一般設置為
0
,保留供未來使用。 - Tag Data:實際的數(shù)據(jù)部分,包含音頻、視頻或元數(shù)據(jù)。
★TS
一種流媒體傳輸格式,全稱為 MPEG-TS(MPEG Transport Stream),廣泛用于數(shù)字視頻和音頻的傳輸。設計目的在于有效傳輸視頻和音頻數(shù)據(jù),同時保證在不同網(wǎng)絡環(huán)境下的傳輸穩(wěn)定性。
特點:
封裝結構:TS 是一種容器格式。每個流在 TS 中都作為一個獨立的“包”(packet)傳輸,通常每個包的大小為 188 字節(jié),便于同步和處理。
高容錯性:TS 包含冗余數(shù)據(jù)和錯誤校驗信息,使其能夠在傳輸中發(fā)現(xiàn)和糾正錯誤,適合在不穩(wěn)定的網(wǎng)絡環(huán)境下使用
實時流傳輸:TS 具有實時傳輸的特點,通過加入時間戳來保證音視頻同步(PTS/DTS),能夠支持音視頻的實時流式播放。
靈活性:可以封裝多種格式的音頻(如 AAC、MP3)和視頻(如 H.264、H.265),適合多路流媒體傳輸,也支持動態(tài)切換多個音視頻流。*
分層結構
分層結構是分層結構是基于 ISO/OSI 模型,專為高效、多路傳輸設計。它分為三層結構,以支持多路音視頻和數(shù)據(jù)流的實時、可靠傳輸:,專為高效、多路傳輸設計。它分為三層結構,以支持多路音視頻和數(shù)據(jù)流的實時、可靠傳輸:
-
ES層
內容:最底層的數(shù)據(jù)流,包含壓縮編碼后的原始音視頻數(shù)據(jù),如 H.264 編碼的圖像數(shù)據(jù)或 AAC 編碼的音頻數(shù)據(jù)。
作用:不包含任何時間戳或識別信息,主要專注于原始的音視頻內容編碼
一個 ES 流中只包含一種類型的數(shù)據(jù)(視頻,或音頻,或字幕)。
-
PES層
內容:PES 層在 ES 層的基礎上增加了時間戳(PTS/DTS)等信息,確保音視頻同步。
作用:將原始的 ES 數(shù)據(jù)打包成更小的片段,便于在傳輸流中處理;PES 包頭還包含信息以區(qū)分視頻、音頻或其他數(shù)據(jù)。
ES數(shù)據(jù)包比較大,加入PES頭時需將ES進行分割,只在第一個分割的ES上加PES頭(類似于傳輸層的做法)
-
TS層
內容:在 PES 層的基礎上加入了數(shù)據(jù)流的識別信息(PID)和傳輸相關的控制信息。
作用:TS 層是傳輸?shù)淖罱K封裝格式,將 PES 包切分成 188 字節(jié)的 TS 包,每個包中包含同步字、PID、錯誤校驗等信息,確保在網(wǎng)絡傳輸中能夠恢復數(shù)據(jù),便于多路流的管理與傳輸。
ts包大小固定為188字節(jié),ts層分為三個部分:ts header、adaptation field、payload。
-
TS Header:控制和識別,確保接收端識別數(shù)據(jù)包類型和順序。
包含的字節(jié)內容:
-
同步字節(jié)(Sync Byte):固定為
0x47
,用于包頭識別和數(shù)據(jù)同步。 -
傳輸錯誤指示(TEI):用于標識傳輸錯誤。
-
有效負載單元起始指示(Payload Unit Start Indicator, PUSI):指示是否為新的 PES 包的起始。
-
★PID(Packet Identifier):識別和區(qū)分不同類型的數(shù)據(jù)流,如音頻、視頻或信令數(shù)據(jù)(PAT/PMT 等)。
-
pid 決定了負載內容的類型,主要包括:
PAT表
,PMT表
,視頻流,音頻流。常用的PID值:-
PAT 0x0000
作用:PAT 是節(jié)目關聯(lián)表,包含 TS 流中所有節(jié)目的 PID 信息。
用途:
幫助接收端找到每個節(jié)目的 PMT(Program Map Table)位置
,理解流中有哪些節(jié)目以及各節(jié)目對應的 PMT PID。 -
PMT:PMT 是節(jié)目映射表,
通過 PAT 表找到 PMT PID 后,可以解析某個節(jié)目具體的音視頻流的 PID
。 -
視頻流 PID:音視頻的 PID 在 PMT 中定義,通常為一個特定節(jié)目中的視頻數(shù)據(jù)流。接收端通過 PMT 獲取特定節(jié)目的視頻 PID。
-
音頻流 PID:與視頻流類似,PMT 還定義了音頻流的 PID,接收端通過 PMT 找到并解碼音頻流。
-
-
-
控制字段:包括優(yōu)先級、加擾控制和連續(xù)計數(shù)器等,用于數(shù)據(jù)流的管理和加密。
-
-
Adaptation Field:用于同步和補充,確保數(shù)據(jù)流的時間準確性。
-
Payload:實際的音視頻數(shù)據(jù)或信令信息,是 TS 包中最核心的內容。
-
★MP4
常用的多媒體容器格式,廣泛用于存儲音頻、視頻、字幕以及元數(shù)據(jù)
特點:
容器格式:MP4 本身不是編碼格式,而是一個封裝格式,可以包含多種編碼格式的音視頻內容(例如 H.264、AAC)。
高兼容性:MP4 格式在各種設備(如手機、電腦、電視)和平臺上都有很高的兼容性,廣泛支持。
流媒體支持:MP4 支持流式傳輸,可以用于網(wǎng)絡環(huán)境中按需播放音視頻。
靈活的內容組合:MP4 容器可以同時包含視頻、音頻、字幕和元數(shù)據(jù),方便實現(xiàn)多語言字幕、章節(jié)、封面等豐富內容。
MP4的文件結構
MP4 文件結構基于 box(盒子) 的概念,每個box包含不同的信息,這些box以樹形結構的方式組成。每個 Box 都包含一個 Header(頭部) 和 Payload(有效載荷)。
box 由 header 和 body 組成,header 指明 box 的 size 和 type。size 是包含 box header 的整個 box 的大小。
-
Header:包括盒子的大小和類型。
- box type,通常是4個ASCII碼的字符如“ftyp”、“moov”等
- ftyp(File Type Box):指定 MP4 文件的格式、兼容性和品牌,位于文件開頭。它描述了文件的主品牌(Major Brand)、次要版本(Minor Version)、兼容品牌(Compatible Brands)。
- moov(Movie Box):存儲文件級的元數(shù)據(jù),包含有關整個媒體文件的信息。
- mdat(Media Data Box):存儲音視頻實際數(shù)據(jù)的 Box。
- box type,通常是4個ASCII碼的字符如“ftyp”、“moov”等
-
Payload:存儲媒體數(shù)據(jù)或控制信息,可以嵌套其他 Box
!
MP4 文件播放流程
播放器在播放 MP4 文件時通常會按以下流程讀取:
- 讀取
ftyp
Box:判斷文件格式和兼容性。 - 讀取
moov
Box:獲取文件的元數(shù)據(jù)和軌道信息。 - 讀取
mdat
Box:加載實際的音視頻數(shù)據(jù),并根據(jù)moov
中的索引信息解碼播放。 - 分段播放(moof/mfra):對于流媒體或按需播放的 MP4 文件,播放器可以利用
moof
和mfra
快速訪問并流式播放片段。