在視頻編碼中证杭,AVCC(AVC Configuration Box)和Annex B是兩種不同的H.264(也稱為AVC)視頻數(shù)據(jù)存儲(chǔ)格式孩革。它們主要用于在不同的容器格式中存儲(chǔ)和傳輸H.264視頻數(shù)據(jù)俭令。
AVCC(AVC Configuration Box)
定義: AVCC格式主要用于MP4、M4V、MOV等基于ISO/IEC 14496-15標(biāo)準(zhǔn)的文件格式。
特征:
視頻數(shù)據(jù)以NALU(Network Abstraction Layer Unit)的形式存儲(chǔ)剪况,但沒有起始碼。
每個(gè)NALU的前面有一個(gè)表示NALU大小的4字節(jié)長(zhǎng)度字段蒲跨。
AVCC頭包含SPS(序列參數(shù)集)和PPS(圖像參數(shù)集)等配置信息译断,用于初始化解碼器。
使用場(chǎng)景: 常見于文件存儲(chǔ)和某些流媒體協(xié)議或悲,例如DASH孙咪。
Annex B
定義: Annex B格式定義在H.264的Annex B部分,常用于TS(Transport Stream)和RTP(Real-time Transport Protocol)等巡语。
特征:
每個(gè)NALU以0x000001或0x00000001起始碼開始翎蹈。
沒有NALU大小的長(zhǎng)度字段,解碼器通過起始碼識(shí)別NALU邊界男公。
起始碼后面緊跟NALU數(shù)據(jù)荤堪。
使用場(chǎng)景: 常見于實(shí)時(shí)流媒體傳輸協(xié)議,如RTMP、MPEG-TS逞力。
轉(zhuǎn)換示例
在某些情況下曙寡,需要在這兩種格式之間進(jìn)行轉(zhuǎn)換,例如從MP4文件中提取視頻數(shù)據(jù)并通過RTMP流傳輸寇荧。這需要將AVCC格式轉(zhuǎn)換為Annex B格式。
從AVCC轉(zhuǎn)換為Annex B
讀取AVCC格式數(shù)據(jù):
跳過4字節(jié)長(zhǎng)度字段执隧,讀取NALU數(shù)據(jù)揩抡。
添加起始碼:
在NALU數(shù)據(jù)前添加0x00000001或0x000001起始碼。
代碼示例
下面是一個(gè)簡(jiǎn)單的從AVCC格式轉(zhuǎn)換為Annex B格式的代碼示例(偽代碼):
void ConvertAVCCtoAnnexB(const uint8_t* avccData, size_t avccSize, std::vector<uint8_t>& annexBData) {
size_t offset = 0;
while (offset < avccSize) {
// 讀取NALU長(zhǎng)度
uint32_t naluLength = (avccData[offset] << 24) | (avccData[offset + 1] << 16) | (avccData[offset + 2] << 8) | avccData[offset + 3];
offset += 4;
// 添加起始碼
annexBData.push_back(0x00);
annexBData.push_back(0x00);
annexBData.push_back(0x00);
annexBData.push_back(0x01);
// 復(fù)制NALU數(shù)據(jù)
annexBData.insert(annexBData.end(), avccData + offset, avccData + offset + naluLength);
offset += naluLength;
}
}
示例代碼解釋
讀取NALU長(zhǎng)度: 從AVCC數(shù)據(jù)中讀取4字節(jié)的NALU長(zhǎng)度字段镀琉。
添加起始碼: 在轉(zhuǎn)換后的數(shù)據(jù)中添加起始碼峦嗤。
復(fù)制NALU數(shù)據(jù): 將實(shí)際的NALU數(shù)據(jù)從AVCC數(shù)據(jù)中復(fù)制到Annex B格式數(shù)據(jù)中。
通過這種方式屋摔,可以在不同存儲(chǔ)和傳輸場(chǎng)景中靈活處理H.264視頻數(shù)據(jù)