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...