在視頻編碼中,AVCC(AVC Configuration Box)和Annex B是兩種不同的H.264(也稱為AVC)視頻數(shù)據(jù)存儲格式。它們主要用于在不同的容器格式中存儲和傳輸H.264視頻數(shù)據(jù)。
AVCC(AVC Configuration Box)
定義: AVCC格式主要用于MP4、M4V、MOV等基于ISO/IEC 14496-15標準的文件格式。
特征:
視頻數(shù)據(jù)以NALU(Network Abstraction Layer Unit)的形式存儲,但沒有起始碼。
每個NALU的前面有一個表示NALU大小的4字節(jié)長度字段。
AVCC頭包含SPS(序列參數(shù)集)和PPS(圖像參數(shù)集)等配置信息,用于初始化解碼器。
使用場景: 常見于文件存儲和某些流媒體協(xié)議,例如DASH。
Annex B
定義: Annex B格式定義在H.264的Annex B部分,常用于TS(Transport Stream)和RTP(Real-time Transport Protocol)等。
特征:
每個NALU以0x000001或0x00000001起始碼開始。
沒有NALU大小的長度字段,解碼器通過起始碼識別NALU邊界。
起始碼后面緊跟NALU數(shù)據(jù)。
使用場景: 常見于實時流媒體傳輸協(xié)議,如RTMP、MPEG-TS。
轉(zhuǎn)換示例
在某些情況下,需要在這兩種格式之間進行轉(zhuǎn)換,例如從MP4文件中提取視頻數(shù)據(jù)并通過RTMP流傳輸。這需要將AVCC格式轉(zhuǎn)換為Annex B格式。
從AVCC轉(zhuǎn)換為Annex B
讀取AVCC格式數(shù)據(jù):
跳過4字節(jié)長度字段,讀取NALU數(shù)據(jù)。
添加起始碼:
在NALU數(shù)據(jù)前添加0x00000001或0x000001起始碼。
代碼示例
下面是一個簡單的從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長度
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);
// 復制NALU數(shù)據(jù)
annexBData.insert(annexBData.end(), avccData + offset, avccData + offset + naluLength);
offset += naluLength;
}
}
示例代碼解釋
讀取NALU長度: 從AVCC數(shù)據(jù)中讀取4字節(jié)的NALU長度字段。
添加起始碼: 在轉(zhuǎn)換后的數(shù)據(jù)中添加起始碼。
復制NALU數(shù)據(jù): 將實際的NALU數(shù)據(jù)從AVCC數(shù)據(jù)中復制到Annex B格式數(shù)據(jù)中。
通過這種方式,可以在不同存儲和傳輸場景中靈活處理H.264視頻數(shù)據(jù)