CMMB中的H264和AAC打包成ts流

2021-08-06 03:38:22 字數 1233 閱讀 7387

**)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 本群原創資料 目錄中 得到當前巨集塊的畫素 值。然後通過對碼流進行解碼得到當前巨集塊的畫素殘差。最後將殘差和 值加在一起就得到重構的畫素值。如果當前巨集塊的左邊或者右邊的...