H.264/AVC视频编解码技术详解
课时介绍
大家好,今天我们再次探讨H264视频编解码的算法基本原理。在上一期中,我们了解了如何使用H264官方提供的参考代码GM进行视频序列的编码,以及使用GM的解码器对H264码流进行解码生成输出的YOV视频图像文件的方法。今天我们将进一步研究H264编码后生成的码流的结构。在H264语法元素进行编码之后,生成的输出数据都封装为NLUnit来进行传递。这多个NLUnit的数据组合在一起形成了总的输出码流。对于不同的应用场景,NL规定了一种通用的格式来适应不同类型的传输封装类型。一般NLUnit的传输格式分为两大类:自节流格式和RTP包格式。
首先,我们来看一下自节流的格式。自节流的格式是H264标准协议文档中规定的应用格式,在文档中属于-B的部分。这种自节流格式也是大多数编码器实现的默认输出格式。在这种格式中,自节流以连续的比特自节的形式传输编码完成的码流。因此,我们必须设计一种方法来从码流中提取NLUnit的单元。在这个过程中,可以使用0001或001这三个或四个字节作为起始码,通过起始码来区分不同NLUnit之间的分隔。
第二种方式称为RTP的数据包格式。这种包格式方法将NLUnit按照RTP数据包格式封装。使用RTP包格式不需要额外的分隔识别码,因为在包的封装信息中已包含详细的数据长度信息。这种封装格式在H264标准协议文档中没有明确规定,但在解码器中已经做了一定处理。如果要使用这种数据封装格式,可以直接封装NLUnit,而无需使用起始码。只需在每个NLUnit之前添加固定字节,比如两个或四个字节的整数,表示该NLUnit的长度。读取这些字节的数据,即可获取一个完整的NLUnit单元。
由于JAM编码器输出的是流格式,我们在之后的分析过程中以这个字节流的格式为主要分析内容。字节流格式在标准协议文档的复制B章节中定义。在这一章节中,以表格的形式描述了NL单元的语法。表格中包括这几个元素:leading zero(8 bits),表示长度为一个字节的前导铃;如果后面24个比特不是001,那么接下来是一个字节的零数据;随后是statcode prefix的133 bytes,表示一个长度为3个字节的1(24个比特);接着是NLUnit的实际数据,再到末尾的拖尾零数据,一直到下一个NLUnit的开始。这些语法元素都是以不同长度的定长码(即按二进制整数表示)来表示的。主要包括前缀零、直为零的一个字节,以及NLUnit的起始码(固定为001),以及后缀为零。
在了解了NLUnit和H264码流的结构之后,如何从码流中提取NL单元的实际数据呢?方法相当简单——查找statcode prefix(0001或001)之间的数据即为一个NLUnit的有效数据。比如,如果一个二进制文件中的字节流是一段连续的数字,那么它的实际内容就是0001到下一个0001之间的红色数据段。因此,在解码过程中,我们只需查找起始码之间的数据即可获得有效数据。最后,我们将尝试编写一个简单的程序来从一个二进制码流文件中截取0001或001前缀码中间的NLUnit数据,方法也十分简单。
课程介绍
H.264/AVC是目前业界应用为广泛的视频压缩编码标准,包含了先进而且较为成熟的视频编码技术。本课程将从原理、标准和实现等多个角度,详细讲述了H.264/AVC视频编码标准的整体架构与技术细节,不但讲解了H.264/AVC标准协议文档中的内容,还通过实际的H.264码流分析/解码程序的开发来帮助观众更深入地理解H.264编码标准的原理。
推荐课程
信息系统项目管理师自考笔记
李明 · 512人在学
python从0到1:期货量化交易系统(CTP实战,高频及合成K线数据
王先生 · 20580人在学
手把手搭建Java超市管理系统【附源码】(毕设)
汤小洋 · 4047人在学
Java毕设springboot外卖点餐系统 毕业设计毕设源码 使用教
黄菊华 · 731人在学
基于SSM酒店管理系统(毕设)
小尼老师 · 785人在学
java项目实战之购物商城(java毕业设计)
Long · 5073人在学
手把手搭建Java求职招聘系统【附源码】(毕设)
汤小洋 · 1458人在学
Python Django 深度学习 小程序
钟翔 · 2234人在学
城管局门前三包管理系统+微信小程序(vue+springboot)
赖国荣 · 496人在学
Vue+Uni-app(uniapp)入门与实战+赠送仿美团点餐小程序
李杰 · 3843人在学