H264探索

1.H264概述

      H264分为多个标准以适应不同领域的应用,定义了四个不同的类(Profile):Baseline Profile(基类)、Main Profile(主类)、Extended Profile(扩展类)和High Profile(高端类)。

      Baseline Profile:提供I/P帧,仅支持逐行扫描和CAVLC。主要应用在视频会话,如可视电话、会议电视、远程教学、视频监控等,要求低延迟。

      Main Profile:提供I/P/B/SP/SI帧,仅支持逐行扫描和CAVLC。主要应用于网络的视频流,如视频点播、基于网络的视频监控等。

      Extended Profile:提供I/P/B帧,支持逐行扫描和隔行扫描,提供CAVLC或者CABAC。主要应用于消费电子应用,如数字电视广播、数字视频存储等。

      High Profile:在Main Profile的基础上新增:8x8帧内预测,自定义量化,无损视频编码,更多的是YUV格式,像素精度提高到10位或12位等。主要应用于针对高分辨率和高清晰度有特别要求的专业。


      在H264中,处理的图像帧分割成多个16x16的宏块,根据图像编码类型I帧、P帧、B帧等,决定是对图像数据本身处理还是对残差编码处理。图像数据本身即帧内编码I帧,利用图像的空间相关性,去除空间冗余。残差编码,首先利用运动估计技术,在一定范围内的窗口内搜索相对最佳宏块,然后相减形成残差,同时记录当前宏块的运行向量MV。对图像数据或者残差做DCT变换、量化。由于块处理造成“块效应”,为了提高参考图像的准确度、清晰度,可采用环路滤波提高图像清晰度。最后对量化后的系数、运动向量及其他信息做熵编码,形成最后的码流。

      H264将视频压缩系统分为视频编码层VCL和网络提取层NAL,结构如图所示:

     

      视频编码层VCL通过时域、空域预测和变换编码来完成对视频信息的压缩,网络提取层NAL则将于网络相关的信息从视频压缩系统中抽象出来,使网络对于视频编码层是透明的,它主要负责对编码后的数据进行封装,提高鲁棒性、降低误码率。采用分层结构有利于压缩编码与网络传输之间的分离,使视频编码层可以移植到不异构的网络中,适应不同的网络传输。


2.H264码流结构

      H264原始视频码流由一系列NAL单元组成,格式如下图所示:

 

      NAL前存在着起始码0x00000001或者0x000001,解码器检测到起始码作为一个NAL的起始标符,当检测到下一个起始码时,表明当前NAL结束。

      VCL数据就是编码处理的输出,在传输和存储之前,先被映射或者封装进NAL单元(NAL Uint,简称NALU),每个NAL单元包括对应视频编码的NAL头和RBSP(原始字节序列负荷),格式如下:

      

      NAL头部的数据(占一个字节)记录着后面的RBSP是什么类型的数据,是否会被其他帧参考以及网络传输是否有错误。它由三部分组成:

      forbidden_bit(1bit):禁止位,初始为0,网络发现NAL单元有比特错误时可设置为1,以便接收方纠错或者丢弃该单元;

      nal_reference_bit(2bit):当前NAL的优先级,优先级越大,越重要,解码器在处理不过来时,会丢掉重要性为0的NAL;

      nal_unit_type(5bit):NAL的类型,见下图;

      

      举个例子,如下图:

      

      00 00 00 01为起始码,67是NAL的头部,换算一下是0110 0111,参考上表可知这是一个SPS序列。

      关于RBSP的类型,我们可以参考下表:

      

      

      理解了NALU ,基本上就能摸清H264的结构。接下来看看一帧图像是怎么被分为一个又一个NALU的。

      一帧图片经过编码器之后,被编码为一个或者多个slice。NALU是装载着这些slice的载体,NALU跟slice的关系如下图:

      

      slice片和帧的概念是不一样的,一帧代表着一张图片,slice是H264提出的新概念,一帧图像可以被编码为一个或者多个slice。slice装载在NAL中进行网络传输,但是不代表NAL里就是slice,也有装着其他数据,如SPS、PPS、SEI等。如下图:

      

      slice的作用是当做宏块(macroblock)的载体,见上图,可以限制误码的扩散和传输。一张图片有一个或多个slice,每个slice可以分为头和数据,切片头内保存了关于切片的类型、切片宏块的类型、切片帧的数量的信息、参照帧的设置和量化参数的信息,切片数据是储存像素数据的地方,包含最少一个,最多整个图像的宏块(macroblock)

      关于宏块,它是视频信息的主要承载者,包含着每一个像素的色度和亮度信息。解码过程中,最主要的工作就是从码流中获取宏块中的像素阵列。宏块的结构图:

      

      从上面的图中可以看出,宏块中包含了宏块类型、预测类型、CPB、QP、像素的亮度和色度数据集等信息。

      

         

全部评论

相关推荐

02-25 09:55
已编辑
门头沟学院 Java
2.4 一面2.6 二面2.9 三面(hr面)2.13 oc1.15号收到面试电话那会就开始准备,因为一开始没底所以选择推迟一段时间面试,之后开始准备八股,准备实习可能会问的东西,这期间hot100过了有六七遍,真的是做吐了快,八股也是背了忘,忘了背,面经也看了很多,虽然最后用上的只有几道题,可是谁知道会问什么呢自从大二上开始学java以来,一开始做外卖,点评,学微服务,大二下五六月时,开始投简历,哎,投了一千份了无音讯,开始怀疑自己(虽然能力确实很一般),后来去到一家小小厂,但是并不能学到什么东西,而且很多东西都很不规范,没待多久便离开,大二暑假基本上摆烂很怀疑自己,大三上因为某些原因开始继续学,期间也受到一俩个中小厂的offer,不过学校不知道为啥又不允许中小厂实习只允许大厂加上待遇不太好所以也没去,感觉自己后端能力很一般,于是便打算转战测开,学习了一些比较简单的测试理论(没有很深入的学),然后十二月又开始继续投,java和测开都投,不过好像并没有几个面试,有点打击不过并没有放弃心里还是想争一口气,一月初因为学校事比较多加上考试便有几天没有继续投,10号放假后便继续,想着放假应该很多人辞职可能机会大一点,直到接到字节的面试,心里挺激动的,总算有大厂面试了,虽然很开心,但同时压力也很大,心里真的很想很想很想进,一面前几天晚上都睡不好觉,基本上都是二三点睡六七点醒了,一面三十几分钟结束,问的都不太难,而且面试官人挺好但是有些问题问的很刁钻问到了测试的一些思想并不是理论,我不太了解这方面,但是也会给我讲一讲他的理解,但是面完很伤心觉得自己要挂了。但是幸运的是一面过了(感谢面试官),两天后二面,问的同样不算难,手撕也比较简单,但也有一两个没答出来,面试官人很好并没有追问,因为是周五进行的二面,没有立即出结果,等到周一才通知到过了,很煎熬的两天,根本睡不好,好在下周一终于通知二面过了(感谢面试官),然后约第二天三面,听别的字节同学说hr面基本上是谈薪资了,但是我的并不是,hr还问了业务相关的问题,不过问的比较浅,hr还问我好像比较紧张,而且hr明确说了还要比较一下,我说我有几家的面试都拒了就在等字节的面试,三面完后就开始等结果,这几天干啥都没什么劲,等的好煎熬,终于13号下午接到了电话通知oc了,正式邮件也同时发了,接到以后真的不敢信,很激动但更重要的是可以松一口气了,可以安心的休息一下了终于可以带着个好消息过年了,找实习也可以稍微告一段落了,虽然本人很菜,但是感谢字节收留,成为忠诚的节孝子了因为问的比较简单,面经就挑几个记得的写一下一面:1.实习项目的难点说一下2.实习中用到了哪些测试方法3.针对抖音评论设计一下测试用例4.手撕:合并两个有序数组二面:1.为什么转测开2.线程进程区别,什么场景适合用哪个3.发送一个朋友圈,从发出到别人看到,从数据流转的角度说一下会经历哪些过程4.针对抖音刷到广告视频设计测试用例5.手撕:无重复字符的最长字串
厂办龚彪:锲而不舍 金石可镂
查看8道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务