精华内容
下载资源
问答
  • H264编解码原理
    千次阅读
    2017-12-08 15:04:20

    H264是新一代的编码标准,以高压缩高质量和支持多种网络的流媒体传输著称,在编码方面,我理解的他的理论依据是:参照一段时间内图像的统计结果表明,在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内。所以对于一段变化不大图像画面,我们可以先编码出一个完整的图像帧A,随后的B帧就不编码全部图像,只写入与A帧的差别,这样B帧的大小就只有完整帧的1/10或更小!B帧之后的C帧如果变化不大,我们可以继续以参考B的方式编码C帧,这样循环下去。这段图像我们称为一个序列(序列就是有相同特点的一段数据),当某个图像与之前的图像变化很大,无法参考前面的帧来生成,那我们就结束上一个序列,开始下一段序列,也就是对这个图像生成一个完整帧A1,随后的图像就参考A1生成,只写入与A1的差别内容。    

      在H264协议里定义了三种帧,完整编码的帧叫I帧,参考之前的I帧生成的只包含差异部分编码的帧叫P帧,还有一种参考前后的帧编码的帧叫B帧。    

      H264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法

    序列的说明     

      在H264中,图像以序列为单位进行组织,一个序列是一段图像编码后的数据流,以I帧开始,到下一个I帧结束。    

      一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。        

      一个序列就是一段内容差异不太大的图像编码后生成的一串数据流。当运动变化比较少时,一个序列可以很长,因为运动变化少就代表图像画面的内容变动很小,所以就可以编一个I帧,然后一直P帧、B帧了。当运动变化多时,可能一个序列就比较短了,比如就包含一个I帧和3、4个P帧。

    三种帧的说明

    I帧 帧内编码帧,I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)。

    1)它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;

    2)解码时仅用I帧的数据就可重构完整图像;

    3)I帧描述了图像背景和运动主体的详情;

    4)I帧不需要参考其他画面而生成;

    5)I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);

    6)I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;

    7)I帧不需要考虑运动矢量;

    8)I帧所占数据的信息量比较大。

    P帧 前向预测编码帧。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)。

    P帧的预测与重构:P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以得到P帧“某点”样值,从而可得到完整的P帧。

    1)P帧是I帧后面相隔1~2帧的编码帧;

    2)P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差);

    3)解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像;

    4)P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧;

    5)P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧;

    6)由于P帧是参考帧,它可能造成解码错误的扩散;

    7)由于是差值传送,P帧的压缩比较高。

    B帧双向预测内插编码帧。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况,但我这样说简单些),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累。

    B帧的预测与重构:B帧以前面的I或P帧和后面的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到B帧“某点”样值,从而可得到完整的B帧。

    1)B帧是由前面的I或P帧和后面的P帧来进行预测的;

    2)B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;

    3)B帧是双向预测编码帧;

    4)B帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确;

    5)B帧不是参考帧,不会造成解码错误的扩散。

    注:I、B、P各帧是根据压缩算法的需要,是人为定义的,它们都是实实在在的物理帧。一般来说,I帧的压缩率是7(跟JPG差不多),P帧是20,B帧可以达到50。可见使用B帧能节省大量空间,节省出来的空间可以用来保存多一些I帧,这样在相同码率下,可以提供更好的画质。

    压缩算法的说明

    h264的压缩方法:

    1.分组:把几帧图像分为一组(GOP,也就是一个序列),为防止运动变化,帧数不宜取多。

    2.定义帧:将每组内各帧图像定义为三种类型,即I帧、B帧和P帧;

    3.预测帧:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;

    4.数据传输:最后将I帧数据与预测的差值信息进行存储和传输。     

    帧内(Intraframe)压缩也称为空间压缩(Spatial compression)。当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似帧内一般采用有损压缩算法,由于帧内压缩是编码一个完整的图像,所以可以独立的解码、显示。帧内压缩一般达不到很高的压缩,跟编码jpeg差不多。       

    帧间(Interframe)压缩的原理是:相邻几帧的数据有很大的相关性,或者说前后两帧信息变化很小的特点。也即连续的视频其相邻帧之间具有冗余信息,根据这一特性,压缩相邻帧之间的冗余量就可以进一步提高压缩量,减小压缩比。帧间压缩也称为时间压缩(Temporal compression),它通过比较时间轴上不同帧之间的数据进行压缩帧间压缩一般是无损的。帧差值(Frame differencing)算法是一种典型的时间压缩法,它通过比较本帧与相邻帧之间的差异,仅记录本帧与其相邻帧的差值,这样可以大大减少数据量。  

    顺便说下有损(Lossy )压缩和无损(Lossy less)压缩。

    无损压缩也即压缩前和解压缩后的数据完全一致。多数的无损压缩都采用RLE行程编码算法。

    有损压缩意味着解压缩后的数据与压缩前的数据不一致。在压缩的过程中要丢失一些人眼和人耳所不敏感的图像或音频信息,而且丢失的信息不可恢复。

    几乎所有高压缩的算法都采用有损压缩,这样才能达到低数据率的目标。丢失的数据率与压缩比有关,压缩比越小,丢失的数据越多,解压缩后的效果一般越差。此外,某些有损压缩算法采用多次重复压缩的方式,这样还会引起额外的数据丢失。

    更多相关内容
  • ffmpeg4.0+OpenCV+VS2017 H264编解码示例。已经配置好环境,不需要再进行配置
  • window 编译 FFmpeg 2.5.11, 支持 G711 和 H264 编解码 ,包含 ( dll ,include ,lib)
  • h264编解码

    2015-07-21 16:39:37
    H264编解码,用于视频编解码,不错的C代码。
  • H264编解码的一些常用知识,方便学习和记忆,如:在一个GOP中,P、B帧是由I帧预测得到的等等一些常识问题。
  • 基于ARM的H264编解码实现
  • h264编解码(linux)

    热门讨论 2013-03-28 13:08:26
    到网上整理了下H264编解码,解压之后可直接make
  • H.264编解码器支持高达1280x720@30 fps的HD分辨率,JPEG编解码器支持高达1920x1080的分辨率可用于快照功能。引擎可编程到基线、主轮廓或高轮廓功能,帧速率和压缩数据速率也可以被编程用于高效的视频流应用。
  • H264编解码代码

    2017-07-05 20:58:51
    第8章 H264 编解码代码
  • Hi3531 H264 编解码处理器 官方文档 内容主要 视频编解码处理、视频与图形处理、智能识别
  • 使用C C++实现屏幕录制 屏幕录制大师,基于XEngine开发的一套屏幕录制软件. 可以录制屏幕,录制声音.打包成指定格式. 此程序提供了c c++实现h264编解码的例子 此程序提供了c c++实现aac音频编解码例子
  • Rockchip平台h264h265硬件编解码,欢迎大家下载使用!
  • 实现并优化了标准C版本的H264标准高清解码器,目前该解码器支持 Main profile级别选项,Baseline profile以及 High Profile级别的部分选项。实验表明,在输出同样质量重建图像的情况下,与各开源标准解码器相比,...
  • H264编解码器系统设计以及优化.pdf
  • H264编解码理论

    2018-04-03 10:37:16
    带标签的介绍H264编解码的详细文档,讲解比较清楚,高清版。
  • 实现代码主要参考雷神的视音频复用器(muxer),来实现 g711+h264 写入MP4文件。 (不支持H264编解码) 雷神: https://blog.csdn.net/leixiaohua1020/article/details/39802913。
  • 基于SIP协议和H264编解码优化的IP可视电话设计
  • H264编解码\嵌入式系统设计和网络摄像机解决方案的论文研究
  • 使用C C++实现屏幕录制 屏幕录制大师
  • H264编解码源码

    2014-06-28 21:21:47
    Cisco贡献出来的H264编解码源码实现,支持Linux、Mac、Android、iOS、Windows等操作系统,对视频技术的发展是莫大的贡献。
  • h264编解码算法,生成算法动态库,编译库和解码库,代码已要VS上编译通过。
  • h264编解码for android,实现将camera yuv数据编码成h264通过网络传输,客户端端接收数据后解码播放
  • H.264 编解码的一个简单实现 实现了帧内 帧间编码
  • 视频H264编解码知识整理

    万次阅读 多人点赞 2017-10-02 12:00:09
    简介视频编解码网上介绍不少,不过大部分比较零散,经过近一年的学习,整理笔记反馈到社区,也加深一遍自己的理解。欢迎指正错误和讨论学习,谢谢浏览。H264是一种视频压缩标准。 根据不同类别,编码器会使用不同...

    简介
    网络提取层(NAL network abstraction layer )和视频编码层(VCL video coding)
    码率、帧率、分辨率
    其它
    总结

    简介

    视频编解码网上介绍很多,整理了不少笔记,经过近一年的学习,把整理的笔记反馈到社区,也加深一遍自己的理解。欢迎指正错误和讨论学习,谢谢浏览。

    H264是一种视频压缩标准。
    根据不同类别,编码器会使用不同类型的帧,I帧、P帧和B帧。
    这里写图片描述

    (图出自H.264视频压缩标准白皮书)

    I帧:自身可以通过视频解压算法解压成一张单独的完整的图片。P帧只需要参考前面的I帧或P帧,而B帧则需要同时参考前面和后面的I帧或P帧。
    在H.264基准类中,仅使用I帧和P帧以实现低延时,因此是网络摄像机和视频编码器的理想选择。

    网络提取层(NAL network abstraction layer )和视频编码层(VCL video coding layer)

    H264有严格的规范,以00 00 00 01分割之后的下一个字节就是NALU类型,用来描述此帧的意义。
    NALU类型:
    (1)第1位禁止位,值为1表示语法出错
    (2)第2~3位为参考级别
    (3)第4~8为是nal单元类型
    以通常的首帧来看:
    这里写图片描述

    打印出来为103(用十六进制软件分析的话值为67),转为二进制为‭0110 0111‬,4-8为00111,转为十进制为7,释义见下:
    

    0,未使用
    1,不分区,非IDR图像的片
    2,片分区A 3,片分区B 4,片分区C
    5,IDR图像的片段
    6,补充增强信息单元(SEI)
    7,序列参数集sps
    8,图像参数集pps
    9,分界符 10,序列结束符 11,流结束符 12填充 13..23保留 24..31未使用

    即是sps,仔细看还有第二个分隔符,为104释义为8,即pps。这一帧内包含了H264的大部分精华,在使用中把此帧喂入解码器是很关键的,简单介绍一下:
    SPS:包括了一个图像序列的所有信息(包含的是针对一连续编码视频序列的参数,如标识符seq_parameter_set_id、帧数及POC的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等)
    PPS:包括了一个图像所有片的信息(对应的是一个序列中某一副图像或者某几幅图像,参数如标识符pic_parameter_set_id、可选的seq_parameter_set_id、熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等)
    在后面的实践Demo中会观察到此帧的重要性。

    接下来的第二帧是实际意义上的关键帧(I帧):
    这里写图片描述
    101释义是5,代码表示的话是:

    int value = buf[4] & 0x0f;//nalu, 5是I帧, 7是sps 8是pps.

    VCL即编码处理的输出,它表示被压缩编码后的视频数据序列,这里有几个知识点,差分编码、运动补偿、帧内预测,有心的朋友可以去详细搜索学习,知识点这里用笔记里的记录做一个简单介绍:

    差分编码:包括H.264在内的大多数视频压缩标准都采用这种方法,只有第一个图像(I帧)是将全帧图像信息进行编码。在后面的两个图像(P帧)中,其静态部分将参考第一个图像,而仅对运动部分使用运动矢量进行编码,从而减少发送和存储的信息量。
    运动补偿:将一个帧分为一系列的宏块。然后,通过在参考帧中查找匹配块的方式,逐块地构建一个新帧。
    帧内预测:对帧中每个宏块内较小的像素块进行连续预测。

    码率、帧率、分辨率

    这三个参数直观的影响到视频流的大小,视频清晰度等观看体验。码率一定的情况下,分辨率与清晰度成反比关系:分辨率越高,图像越不清晰,分辨率越低,图像越清晰。分辨率一定的情况下,码率与清晰度成正比关系,码率越高,图像越清晰;码率越低,图像越不清晰。
    下面是一张参考图:
    这里写图片描述

    抱歉,出处忘记了…

    分辨率常用的有:
    720*480(标清480p)
    1280*720(高清720p)
    1920*1080(全高清1080p, 1920*2 * 1080*2 = 4k)
    3840×2160(八百万像素的超高清4k,往上再4倍就是8k超高清)
    其实含480p以下为标清,480p以上为高清,经典的有720p、1080i、1080p,1080p又称全高清,1080p以上都为超清。(i隔行扫描多用于电视机信号,p逐行扫描)
    帧率:
    在1秒钟时间里传输的图片的帧数,影响画面流畅度,常说的24帧电影、在游戏上的FPS,都是这个概念,通常手机上20帧左右即可。
    ps:Gop是指多少秒一个I帧。
    码率:
    右键看一个视频的属性,详细里有一个总比特率,计算方式是:

    【码率】(kbps)=【文件大小】(字节 )X8 /【时间】(秒)

    码率单位是kbps即千位每秒。也就是取样率(和音频的采样率有区别,采样率单位是Hz,表示每秒采样次数),单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件,但是文件体积与取样率是成正比的,所以几乎所有的编码格式重视的都是如何用最低的码率达到最少的失真。码率越高越清晰,反之则画面粗糙而多马赛克,1080P不一定比720P清晰,打开看码率对比最实际~

    其它

    IDR帧和I帧:首个I帧叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像,不过I帧不一定是IDR图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空(DPB,DecodedPictureBuffer 参考帧列表),将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。

    H265和H264
    同样的画质和同样的码率,H.265比H.264 占用的存储空间要少理论50%;如果存储空间一样大,那么意味着,在一样的码率下H.265会比H2.64 画质要高一些理论值是30%~40%,但是因为部分专利价太高(部分公司创建联盟,收取专利费),计算复杂度(编码要求的硬件性能较高) 普及难度直线上升。

    逐行扫描和隔行扫描:详细画面效果参见下

    http://blog.csdn.net/syb773849846/article/details/52120030

    带宽,码流,在线人数之间的关系:

    带宽 / (码流 * 8) = 同时在线人数
    文件大小 = 时间×码率/8
    一个视频文件的大小为5.86M,播放时长为3分7秒:
    1:该文件对应的码流就是
    5.86 * 1024 * 1024 * 8 / (3 * 60 + 7) =262872.95657754bps
    2:10M独享带宽能支撑的同时在线人数
    10* 1024 * 1024 / 262872.95657754 =39.889078498294
    3:支撑1000人同时在线的系统最少需要的带宽数为
    262872* 1000 / (1024 * 1024) = 250.69427490234M

    场频:画面刷新次数。
    行频:屏幕的水平扫描频率,以Hz为单位。它越大就意味着显示器可以提供的分辨率越高,稳定性越好。

    行频 = height(垂直分辨率) * 1.04~1.08 * 场频

    YUV格式:一种颜色编码方式,可以转化成我们常用的RGB色值。Y代表亮度,UV代表色值,Y可以显示一张完整的黑白图像。这样的设计解决了黑白电视和彩色电视的兼容,并且YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。

    基本概念整理:

    DTS:Decode Time Stamp。DTS主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码。在没有B帧存在的情况下DTS的顺序和PTS的顺序应该是一样的。DTS主要用于视频的解码,在解码阶段使用.PTS主要用于视频的同步和输出.在display的时候使用.在没有B frame的情况下.DTS和PTS的输出顺序是一样的.
    SPS(序列的参数集):包括了一个图像序列的所有信息(包含的是针对一连续编码视频序列的参数,如标识符seq_parameter_set_id、帧数及POC的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等)
    PPS(图像的参数集):包括了一个图像所有片的信息(对应的是一个序列中某一副图像或者某几幅图像,参数如标识符pic_parameter_set_id、可选的seq_parameter_set_id、熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等)
    流地址:HLT、RTMP等视频流地址的话,开源的很多,分享一个从直播流程到搭建服务器的良心博客:
    http://blog.csdn.net/huaxun66/article/details/53427771

    总结

    音视频解决方案很多,ffmpeg是绕不过去的开源技术,ndk开发在这一块的重要性可想而知。当然,无论是视频流地址还是各种开源的播放器,也都离不开协议这一基础概念。了解H264,窥一斑而知全豹,渐进学习慢慢就能看到整个音视频领域的大致规模。共勉~

    录屏用udp发送到其它屏幕显示

    展开全文
  • NVIDIA显卡H.264/H.265硬编解码参考文档,包括API接口和相关参数结构的详细描述,以及相应的问题处理方法,值得相关人员参考。
  • OpenH264 OpenH264是一个编解码器库,支持H.264编码和解码。 它适用于WebRTC等实时应用程序。 有关更多详细信息,请参见http://www.openh264.org/。 编码器功能的缺点OpenH264 OpenH264是一个编解码器库,支持H.264...
  • H264编解码

    2012-08-08 18:25:12
    H264编解码,其中含有编码程序和解码程序相互分开。利于学习,每个函数有相应的注解。
  • H264 编解码协议详解

    万次阅读 多人点赞 2018-10-24 17:56:44
    1.、什么是 H264H264 是 MPEG-4 标准所定义的最新编码格式,同时也是技术含量最高、代表最新技术水平的视频编码格式之一,标准写法应该是H.264 H264 视频格式是经过有损压缩的,但在技术上尽可能做的降低存储...

    1.、什么是 H264?

    H264 是 MPEG-4 标准所定义的最新编码格式,同时也是技术含量最高、代表最新技术水平的视频编码格式之一,标准写法应该是H.264

    H264 视频格式是经过有损压缩的,但在技术上尽可能做的降低存储体积下获得较好图像质量和低带宽图像快速传输。

    2、一些相关名词解释

    下图为 H264 码流分层图
    image

    2.1、VCL & NAL

    H264 原始码流是由一个接一个 NALU(NAL Unit) 组成,它的功能分为两层,VCL(Video Coding Layer)视频编码层和 NAL(Network Abstraction Layer)网络提取层。

    1. VCL:包括核心压缩引擎和块、宏块和片的语法级别定义,设计目标是尽可能地独立于网络进行高效的编码;
    2. NAL:负责将 VCL 产生的比特字符串适配到各种各样的网络和多元环境中,覆盖了所有片级以上的语法级别;

    NAL是 H.264 为适应网络传输应用而制定的一层数据打包操作。传统的视频编码算法编完的视频码流在任何应用领域下(无论用于存储、传输等)都是统一的码流模式,视频码流仅有视频编码层 VCL(Video Coding Layer)。而 H.264 可根据不同应用增加不同的 NAL 片头,以适应不同的网络应用环境,减少码流的传输差错。

    在 VCL 进行数据传输或存储之前,这些编码的 VCL 数据,被映射或封装进NAL单元(NALU)。

    一个 NALU = 一组对应于视频编码的 NALU 头部信息 + 一个原始字节序列负荷(RBSP,Raw Byte Sequence Payload)
    

    image

    一个原始的 H.264 NALU 单元常由 [StartCode] [NALU Header] [NALU Payload] 三部分组成,其中 Start Code 用于标示这是一个NALU 单元的开始,必须是 “00 00 00 01”

    实际原始视频图像数据保存在 VCL 分层的 NAL Units 中

    2.2、片(slice)

    一个片 = Slice Header + Slice Data
    

    片是 H.264 提出的新概念,实际原始视频图像数据保存在 VCL 层级的 NAL Unit 中,这部分数据在码流中被称作是片(slice)。一个 slice 包含一帧图像的部分或全部数据,换言之,一帧视频图像可以编码为一个或若干个 slice。一个 slice 最少包含一个宏块,最多包含整帧图像的数据。在不同的编码实现中,同一帧图像中所构成的 slice 数目不一定相同。

    一个 slice 编码之后被打包进一个 NALU,所以 slice = NALU

    那么为什么要设置片呢?

    设置片的目的是为了限制误码的扩散和传输,应使编码片相互间是独立的。某片的预测不能以其他片中的宏块为参考图像,这样某一片中的预测误差才不会传播到其他片中。

    在上图中,可以看到每个图像中,若干宏块(Macroblock)被排列成片。一个视频图像可编成一个或更多个片,每片包含整数个宏块 (MB),每片至少包含一个宏块。

    slice 类型
    slice意义
    I slice只包含 I 宏块
    P slice包含 P 和 I 宏块
    B slice包含 B 和 I 宏块
    SP slice包含 P 或 I 宏块,用于不同码流之间的切换
    SI slice一种特殊类型的编码宏块

    slice 组成

    每一个 slice 总体来看都由两部分组成,一部分作为 slice header,用于保存 slice 的总体信息(如当前 slice 的类型等),另一部分为 slice body,通常是一组连续的宏块结构(或者宏块跳过信息)

    image

    2.3、宏块(Macroblock)

    刚才在片中提到了宏块,那么什么是宏块呢?

    宏块是视频信息的主要承载者。一个编码图像通常划分为多个宏块组成.包含着每一个像素的亮度和色度信息。视频解码最主要的工作则是提供高效的方式从码流中获得宏块中像素阵列。

    一个宏块由一个 16×16 亮度像素和附加的一个 8×8 Cb 和一个 8×8 Cr 彩色像素块组成。

    宏块分类意义
    I 宏块利用从当前片中已解码的像素作为参考进行帧内预测
    P 宏块利用前面已编码图像作为参考进行帧内预测
    B 宏块利用双向的参考图像(当前和未来的已编码图像帧)进行帧内预测

    2.4、帧(frame)和场(filed)

    视频的一场和一帧用来产生一个编码图像,一帧通常是一个完整的图像,当采集视频信号时,如果采用隔行扫描(奇、偶数行),则扫描下来的一帧图像就被分成了两个部分,这每一部分都被称为 [场],根据次序,分为 [顶场] 和 [底场]。

    扩展阅读:为什么会产生场的概念?

    人眼可察觉到的电视视频图像刷新中的闪烁为 0.02 秒,即当电视系统的帧率低于 50 帧/秒,人眼可感觉得出画面的闪烁。常规如 PAL 制式电视系统帧率为 25 帧/秒、NTSC 制式的则为 30 帧/秒,如果采用逐行扫描将不可避免地在视频刷新时产生闪烁现象。而另一方面如果单纯的提高帧率达到避免闪烁刷新效果,则会增加系统的频带宽度。

    这便引出了隔行扫描技术及 [场] 的概念

    在隔行扫描中,每一帧包含两个场(top field)和(bottom field),其中每个 field 包含一帧中一半数量的水平线,top field 包含所有奇数线,bottom field 则包含所有偶数线。则在电视显示过程中,电子枪每发射一行隔一行—先发射奇数行13579…(top field)回头再发射2468…(bottom field)利用两次扫描来完成一幅图像,因为视觉的滞留性,我们看到的效果是差不多的。如在 NTSC 视频中 frame 的频率为30次/秒-àfield的频率则为 60 次/秒,大于了人眼可察觉闪烁的频率。

    适用类型
    方式作用域
    帧编码方式活动量较小或者静止的图像宜采用
    场编码方式活动量较大的运动图像

    image

    2.5、I 帧、P 帧、B 帧与 pts/dts

    帧的分类中文意义
    I 帧帧内编码帧,又称 intra pictureI 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是一个图像经过压缩后的产物
    P 帧前向预测编码帧,又称 predictive-frame通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧
    B 帧双向预测帧,又称 bi-directional interpolated prediction frame既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧
    • I frame: 自身可以通过视频解压算法解压成一张单独的完整的图片;
    • P frame:需要参考其前面的一个 I frame 或者 B frame 来生成一张完整的图片;
    • B frame: 则要参考其前一个 I 或者 P帧 及其后面的一个 P 帧来生成一张完整的图片;
    pts/dts
    名称意义
    PTS(Presentation Time Stamp)PTS 主要用于度量解码后的视频帧什么时候被显示出来
    DTS(Decode Time Stamp)DTS 主要是标识内存中的 bit 流什么时候开始送入解码器中进行解码

    image

    DTS 与 PTS 的不同:
    DTS 主要用户视频的解码,在解码阶段使用。PTS主要用于视频的同步和输出,在 display 的时候使用。再没有 B frame 的时候输出顺序是一样的。

    2.6、GOP

    GOP 是画面组,一个 GOP 是一组连续的画面。
    GOP 一般有两个数字,如 M = 3,N = 12,M 制定 I 帧与 P 帧之间的距离,N 指定两个 I 帧之间的距离。那么现在的 GOP 结构是

    I BBP BBP BBP BB I
    

    增大图片组能有效的减少编码后的视频体积,但是也会降低视频质量,至于怎么取舍,得看需求了。

    2.7、IDR

    一个序列的第一帧叫做 IDR帧(Instantaneous Decoding Refresh,立即解码刷新)。

    I 帧和 IDR 帧都是使用帧内预测,本质上是同一个东西,在解码和编码中为了方便,将视频序列中第一个 I 帧和其他 I 帧区分开,所以把第一个 I 帧称作 IDR,这样就方便控制编码和解码流程。

    IDR 帧的作用是立刻刷新,使错误不致传播,从 IDR 帧开始,重新算一个新的序列开始编码。

    核心作用

    H.264 引入 IDR 帧是为了解码的重同步,当解码器解码到 IDR 帧时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会,IDR 帧之后的帧永远不会使用 IDR 之前的图像的数据来解码。

    3、H264 码流分层结构

    image

    如上图,在 H264 中,句法元素共被组织成:序列、图像(帧)、片、宏块、子宏块五个层次。

    句法元素的分层结构有助于更有效地节省码流。例如,在一个图像中,经常会在各个片之间有相同的数据,如果每个片都同时携带这些数据,势必会造成码流的浪费。更为有效的做法是将该图像的公共信息抽取出来,形成图像一级的句法元素,而在片级只携带该片自身独有的句法元素。

    4、NALU Header & RBSP 结构

    image

    如上图:NALU = NAL Header + RBSP

    4.1、NALU Header

    前面已经说到,每个 NALU 由一个字节的 Header 和 RBSP(Raw Byte Sequence Payload) 组成。

    NALU Header 由三部分组成,forbidden_bit(1bit),nal_ref_idc(2bits)代表优先级,nal_unit_type(5bits)代表该 NALU 的类型。

    forbidden_zero_bit

    1 bit,H264 规定此位必须为 0

    nal_ref_idc

    用于表示当前 NALU 的重要性,值越大,越重要

    解码器在解码处理不过来的时候,可以丢掉重要性为 0 的 NALU

    1. nal_ref_idc 不等于 0 时, NAL unit 的内容可能是 SPS/PPS/参考帧 的片
    2. nal_ref_idc 等于 0 时,NAL unit 的内容可能是非参考图像的片
    3. 当某个图像的片的 nal_ref_id 等于 0 时,该图像的所有片均应等于 0

    nal_unit_type

    nal_unit_type 是否包含 VCL 层编码数据分为 VCL NAL units 和 non-VCL NAL units;

    VCL NAL units 中包含 VCL 层编码输出的数据, 而 non-VCL NAL units 则不包含。

    nal_unit_typethe content of NAL unit
    1 ~ 5VCL NAL units
    others(SPS/PPS .etc)non-VCL NAL units

    所有的值对于类型如下:

    image

    4.2、RBSP

    image

    上图是 RBSP 序列举例

    image

    上图是 RBSP 的描述

    SODB 与 RBSP

    SODB 数据比特串 -> 是编码后的原始数据.
    RBSP 原始字节序列载荷 -> 在原始编码数据的后面添加了 结尾比特。一个 bit “1” 若干比特 “0”,以便字节对齐。

    image

    展开全文
  • H264AVC编解码算法分析与优化研究.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,810
精华内容 21,524
关键字:

h264编解码

友情链接: esprit_for_direction.zip