一幀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 它的原因是 ...