一 annexb和avcc
Annexb
视频编码成的包叫做Network Abstraction Layer Units, 也简称为NALU、NAL,每个NALU包都可以被单独的解析和处理,每个NALU包的第一个字节包含了NALU类型,bit3-bit7包含的内容尤其重要(bit 0一定是off的,bit1-2指定了这个NALU是否被其他NALU引用)。
NALU格式分为2类,VCL和non-VCL,总共有19种不同的NALU格式。 即常见的如0x00 00 00 01/0x00 00 01
avcc格式
另一个存储H.264流的方式是AVCC格式,在这种格式中,每一个NALU包都加上了一个指定其长度(NALU包大小)的前缀(in big endian format大端格式),这种格式的包非常容易解析,但是这种格式去掉了Annex B格式中的字节对齐特性,而且前缀可以是1、2或4字节,这让AVCC格式变得更复杂了,指定前缀字节数(1、2或4字节)的值保存在一个头部对象中(流开始的部分),这个头通常称为'extradata'或者'sequence header',
编码器出来的帧都是annexb格式,大部分容器会把annexb转换为avcc再进行存储。
例如mp4封装代码:
if (par->codec_id == AV_CODEC_ID_H264 && trk->vos_len > 0 && *(uint8_t *)trk->vos_data != 1 && !TAG_IS_AVCI(trk->tag)) {
/* from x264 or from bytestream H.264 */
/* NAL reformatting needed */
if (trk->hint_track >= 0 && trk->hint_track < mov->nb_streams) {
ret =

这篇博客介绍了H264视频编码的两种格式——Annex B和AVCC。Annex B格式的NAL单元包含类型信息,而AVCC格式在每个NAL单元前加上长度前缀,便于解析。编码器通常输出Annex B格式,但在如MP4、FLV等容器中,通常需要转换为AVCC格式。ffmpeg通过检查extradata来决定是否需要进行格式转换,并提供了相应的函数实现转换过程。
最低0.47元/天 解锁文章
2312

被折叠的 条评论
为什么被折叠?



