**)cmmb中的h264和aac打包成ts流
南冠彤參照tstools這個開源專案完成了cmmb的merge aac with 264 to ts.
在做的過程中,分成了幾個階段。先試著將h264打包成ts,這花了最大的精力和時間;接著將aac打包成ts;最後將其合併起來。
一、處理h264
1、h264 -> pes
其中,幀率是針對於影象來說的,例如25hz的幀率,就差不多是每個40ms顯示1個影象。
影象分為 i影象、p影象、b影象。
每個影象又由多個片組組成,片組由多個片組成。
每個片又由多個巨集塊組成。片分為i_slice、p_slice、b_slice。巨集塊有i、p、b三種巨集塊。
i_slice裡只有i_mb,
p_slice裡可有p_mb和i_mb,
b_slice裡可有b_mb和i_mb。
通常的乙個影象裡就含一種片,這次的cmmb裡的h264比較簡單,是baseline的profile,只含有i、p幀,而且每個影象就1個slice。
每個nal單元包含:nal頭+負荷
nal的頭一般為00 00 01 或者00 00 00 01,然後到下乙個頭之間都為這乙個nalu的資料。
所以,對於封裝成ts流,只需要去讀取h264的原始檔案,然後找到這個nal頭,再將這個nalu(包含頭和負荷)當成資料打包成pes再打成ts即可。
1/25*90000 = 3600 個clk。
2、pes -> ts
pes打包的時候,按ts協議格式封裝即可。
二、處理aac
aac的ts封裝相對於h264來說就簡單多了。這次的cmmb採用的是aac的adts格式封裝,同h264類似,也有其自己的分界符,然後兩分界符 之間就是資料,分界符為1111 1111 1111,即fff。依次讀取aac的原始檔案,遇到乙個fff時,將其後的資料連同這個fff的頭看成整體,作為負載封入pes。同樣的,每幀都需要打 入pts。cmmb流中也附有aac的pts,讀取後計算寫入pes即可。也省了我去根據取樣率,每幀的樣本率去計算pts。
三、合併h264和aac的ts流
做完了上兩步工作,最後一步就更簡單了。
先是打入pat、pmt。pmt需要稍微修改,因為加入了音訊,所以要在其中指明音訊的型別和pid。
對於h264更底層的東西,就沒研究下去了。對於h264的sps獲取pts,也沒整太明白。還有pcr這方面,都還不太清楚。後面再找時間慢慢研究吧~
h264和aac 封裝成flv
flv是流 封裝格式,我們可以將其資料看為二進位制位元組流。總體上看,flv包括檔案頭 file header 和檔案體 file body 兩部分,其中檔案體由一系列的tag及tag size對組成。flv格式解析 header 頭部分由一下幾部分組成 signature 3 byte versi...
H 264 中的相關問題
幀內解碼時,在解碼端,首先通過當前巨集塊左邊 上邊已經解碼完成的巨集塊使用當前巨集塊的 模式 模式計算過程請參見我的 h.264 本群原創資料 目錄中 得到當前巨集塊的畫素 值。然後通過對碼流進行解碼得到當前巨集塊的畫素殘差。最後將殘差和 值加在一起就得到重構的畫素值。如果當前巨集塊的左邊或者右邊的...
H 264 中的相關問題
幀內解碼時,在解碼端,首先通過當前巨集塊左邊 上邊已經解碼完成的巨集塊使用當前巨集塊的 模式 模式計算過程請參見我的 h.264 本群原創資料 目錄中 得到當前巨集塊的畫素 值。然後通過對碼流進行解碼得到當前巨集塊的畫素殘差。最後將殘差和 值加在一起就得到重構的畫素值。如果當前巨集塊的左邊或者右邊的...