h264碼流rtp打包(一)

2021-06-16 23:56:07 字數 1833 閱讀 2275

一幀image

編碼完的資料儲存在

h264buffer

中,編碼後的

h264

碼流的大小為

nh264size 

因為對於nalu,並不是一幀對應乙個nalu,而是對於slice而言,乙個slice就封裝層乙個nal,所以一幀可以有多個slice,即一幀有多個nal。

具體一幀中有幾個nalu則是可以再pps中引數中進行設定的,每遇到乙個idr,則此時就將對應的sps,pps進行一

個更新,nal的生成過程:先是對header裡面的8個bits進行設定,然後是payload。

對於位元組流編碼的碼流編碼,去掉每個slice

前面的4

個字首碼,就是

nal的內容了。而對於

rtp封裝打包不需要字首碼,所以在進行

rfc3984_pack

進行打包之前需提取

nal。

為了讓處理流程看起來比較順暢,我把幾個處理流程都寫在同一函式裡頭。

[cpp]view plain

copy

//return value: number of the slice

static

intframe_slice_nal_pro(unsigned 

char

*h264buffer, 

intnh264size)  

else

}  }  if

(nslicecount >= 0)  

//提取nal

mblk_t *m;  

msqueue *nalus;  

inti;  

intnnalnum = nslicecount + 1;  

for(i=0; i

m = allocb(pnslicesize[i] + 10, 0);  

//拷貝nal到mblk中,然後將mblk存於nalus佇列裡頭

memcpy(m->b_wptr, pcslicebuffer[i] + 4, (pnslicesize[i] - 4));  

m->b_wptr    += pnslicesize[i] - 4;  

ms_queue_put(nalus,m);  

}  ..................  

//rtp打包傳送出去

if(!ms_queue_empty(nalus))  

rfc3984_pack(d->packer,nalus,f->outputs[0],ts);  

............  

return

(nslicecount + 1);  

}  

[cpp]view plain

copy

"code"

class

="cpp"

>"code"

class

="cpp"

>

h 264碼流打包分析

h264碼流打包分析 sodb 資料位元串 最原始的編碼資料 rbsp 原始位元組序列載荷 在sodb的後面填加了結尾位元 rbsp trailing bits 乙個bit 1 若干位元 0 以便位元組對齊。ebsp 擴充套件位元組序列載荷 在rbsp基礎上填加了仿校驗位元組 0x03 它的原因是 ...

H264碼流打包分析

h264碼流打包分析 sodb 資料位元串 最原始的編碼資料 rbsp 原始位元組序列載荷 在sodb的後面填加了結尾位元 rbsp trailing bits 乙個bit 1 若干位元 0 以便位元組對齊。ebsp 擴充套件位元組序列載荷 在rbsp基礎上填加了仿校驗位元組 0x03 它的原因是 ...

h 264碼流打包分析

h264碼流打包分析 sodb 資料位元串 最原始的編碼資料 rbsp 原始位元組序列載荷 在sodb的後面填加了結尾位元 rbsp trailing bits 乙個bit 1 若干位元 0 以便位元組對齊。ebsp 擴充套件位元組序列載荷 在rbsp基礎上填加了仿校驗位元組 0x03 它的原因是 ...