h264是一种视频编码标准。它可以使用两种不同的字节流格式:基于RBSP的Annex-B和基于MP4的AVCC。
Annex-B和AVCC都是将h264数据打包到字节流中进行传输。它们的差异在于如何描述NALU(网络抽象层单元)的长度和类型信息。
Annex-B在NALU前添加一个4字节的start code(0x00000001),描述了NALU的长度和类型。AVCC使用一个4字节的长度字段,表示NALU的长度,之后紧跟着NALU的类型信息。
使用Annex-B时,下面的代码可以将NALU打包成字节流:
unsigned char start_code[] = {0x00, 0x00, 0x00, 0x01};
unsigned char nal_type = 0x05;
unsigned char nal_data[] = {0x67, 0x42, 0x00, 0x0A};
unsigned char buf[8];
memcpy(buf, start_code, 4);
buf[4] = nal_type;
memcpy(buf + 5, nal_data, 3);
使用AVCC时,下面的代码可以将NALU打包成字节流:
unsigned char nal_hdr[] = {0x00, 0x00, 0x00, 0x01};
unsigned int nal_len = 3;
unsigned char nal_type = 0x05;
unsigned char nal_data[] = {0x67, 0x42, 0x00};
unsigned char buf[8];
memcpy(buf, nal_hdr, 4);
buf[4] = (nal_len >> 24) & 0xff;
buf[5] = (nal_len >> 16) & 0xff;
buf[6] = (nal_len >> 8) & 0xff;
buf[7] = (nal_len)&0xff;
memcpy(buf + 8, nal_data, 3);
总的来说,使用Annex-B相对于AVCC的优势在于它更容易处理多个NALU的字节流。但是,在实际应用中,具体的选择取决于硬件和软件等因素。