h264和aac 封裝成flv

2021-09-17 22:04:51 字數 1717 閱讀 2779

flv是流**封裝格式,我們可以將其資料看為二進位制位元組流。總體上看,flv包括檔案頭(file header)和檔案體(file body)兩部分,其中檔案體由一系列的tag及tag size對組成。

flv格式解析

header

頭部分由一下幾部分組成

signature(3 byte)+version(1 byte)+flags(1 bypte)+dataoffset(4 byte)

back-pointers 固定4個位元組,表示前乙個tag的size。

tag 分三種型別,video、audio、scripts。

tag組成

tag type+tag data size+timestamp+timestampextended+stream id+ tag data

type 1個位元組。8為audio,9為video,18為scripts

tag data size 3個位元組。表示tag data的長度。從streamd id 後算起。

timestreamp 3個位元組。時間戳

timestampextended 1個位元組。時間戳擴充套件字段

stream id 3個位元組。總是0

tag data 資料部分

我們根據例項來分析:

看到第乙個tag

type=0x12=18。這裡應該是乙個scripts。

size=0x000125=293。長度為293。

timestreamp=0x000000。這裡是scripts,所以為0

timestampextended =0x00。

stream id =0x000000

具體的**

1.寫檔案頭

int cflvencoder::openfile(std::string flvfilename)

return -1;

}

2.寫metadata

void cflvencoder::setparamvideo(uint32_t nwidth,uint32_t nheight,uint32_t nframerate )

}void cflvencoder::writemeta(uint32_t nframerate,uint32_t nwidth,uint32_t nheight)

void cflvencoder::rewritemeta()

void cflvencoder::handlevideo(uint8_t* vidoebuf,uint32_t bufsize,int64_t timestamp)

int64_t nowts = m_timerecalculate.getnextvidoetic(timestamp);

int64_t offset = 0;

bool bkey = false;

if (!m_bvideobegin)

//寫acv頭

writevidoeheaders(m_pnalsps,m_pnalpps,m_pnalsei);

m_bvideobegin = true;

m_bvideohead = true;

writevideoframe(m_outbuf,m_outlen,bkey,nowts,nowts);

}else if( m_bvideohead)

}

RTP封裝H264詳解

nalu buff nal資料buff len nal資料長度 cnt 包數 max fu size 每包長度,一般1400 nalu type nal型別 cnt len max fu size 0 len max fu size len max fu size 1 nalu type buff ...

CMMB中的H264和AAC打包成ts流

cmmb中的h264和aac打包成ts流 南冠彤參照tstools這個開源專案完成了cmmb的merge aac with 264 to ts.在做的過程中,分成了幾個階段。先試著將h264打包成ts,這花了最大的精力和時間 接著將aac打包成ts 最後將其合併起來。一 處理h264 1 h264 ...

從h264檔案中讀取檔案並封裝成RTP

首先是整體的 string filename rtspnettyserver.outputpath keyhash h264 file f new file filename if f.exists sendanswer ctx,r,o bufferedinputstream in null try...