一、编码基础概念

1、为什么要进行视频编码?

视频是由一帧帧图像组成,就如常见的gif图片,如果打开一张gif图片,可以发现里面是由很多张图片组成。一般视频为了不让观众感觉到卡顿,一秒钟至少需要16帧画面(一般是30帧),假如该视频是一个1280x720分辨率的视频,那么不经过编码一秒钟的大小:

结果:1280x720x60≈843.75M

所以不经过编码的视频根本没法保存,更不用说传输了。

2、视频压缩编码标准

视频中存在很多冗余信息,比如图像相邻像素之间有较强的相关性,视频序列的相邻图像之间内容相似,人的视觉系统对某些细节不敏感等,对这部分冗余信息进行处理的过程就是视频编码。

  1. H.26X系列(由ITU[国际电传视讯联盟]主导)
  2. H.261:主要在老的视频会议和视频电话产品中使用
  3. H.263:主要用在视频会议、视频电话和网络视频上
  4. H.264H.264/MPEG-4第十部分,或称AVCAdvanced Video Coding,高级视频编码),是一种视频压缩标准,一种被广泛使用的高精度视频的录制、压缩和发布格式。
  5. H.265:高效率视频编码(High Efficiency Video Coding,简称HEVC)是一种视频压缩标准,H.264/MPEG-4 AVC的继任者。可支持4K分辨率甚至到超高画质电视,最高分辨率可达到8192×43208K分辨率),这是目前发展的趋势,尚未有大众化编码软件出现
  6. MPEG系列(由ISO[国际标准组织机构]下属的MPEG[运动图象专家组]开发)
  7. MPEG-1第二部分:MPEG-1第二部分主要使用在VCD上,有些在线视频也使用这种格式
  8. MPEG-2第二部分(MPEG-2第二部分等同于H.262,使用在DVDSVCD和大多数数字视频广播系统中
  9. MPEG-4第二部分(MPEG-4第二部分标准可以使用在网络传输、广播和媒体存储上

3、编码流程

在进行当前信号编码时,编码器首先会产生对当前信号做预测的信号,称作预测信号(predicted signal)

预测的方式:

  1. 时间上的预测(interprediction),亦即使用先前帧的信号做预测
  2. 空间上的预测 intra prediction),亦即使用同一张帧之中相邻像素的信号做预测

得到预测信号后,编码器会将当前信号与预测信号相减得到残余信号(residual signal),并只对残余信号进行编码,如此一来,可以去除一部份时间上或是空间上的冗余信息。

编码器并不会直接对残余信号进行编码,而是先将残余信号经过变换(通常为离散余弦变换)然后量化以进一步去除空间上和感知上的冗余信息。量化后得到的量化系数会再透过熵编码,去除统计上的冗余信息。

二、H.264编码详解(AVC)

1、H.264是新一代的编码标准,以高压缩高质量和支持多种网络的流媒体传输著称

  1. 相关理解:
  2. 在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内
  3. 所以对于一段变化不大图像画面,我们可以先编码出一个完整的图像帧A,随后的B帧就不编码全部图像,只写入与A帧的差别,这样B帧的大小就只有完整帧的1/10或更小!
  4. B帧之后的C帧如果变化不大,我们可以继续以参考B的方式编码C帧,这样循环下去。
  5. 这段图像我们称为一个序列:序列就是有相同特点的一段数据
  6. 当某个图像与之前的图像变化很大,无法参考前面的帧来生成,那我们就结束上一个序列,开始下一段序列
  7. 也就是对这个图像生成一个完整帧A1,随后的图像就参考A1生成,只写入与A1的差别内容

2、H.264三种帧

在H.264中定义了三种帧:

    I帧:完整编码的帧叫I帧

    P帧:参考之前的I帧生成的只包含差异部分编码的帧叫P帧

    B帧:参考前后的帧编码的帧叫B帧


H264采用的核心算法是帧内压缩和帧间压缩:

    帧内压缩是生成I帧的算法

    帧间压缩是生成B帧和P帧的算法


压缩方法:

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

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

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

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


GOP序列:

    在H264中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流。

    一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像:

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

    一个序列就是一段内容差异不太大的图像编码后生成的一串数据流:

  1. a、当运动变化比较少时,一个序列可以很长,因为运动变化少就代表图像画面的内容变动很小,所以就可以编一个I帧,然后一直P帧、B帧了。
  2. b、当运动变化多时,可能一个序列就比较短了,比如就包含一个I帧和34P帧。

在视频编码序列中,GOP即Group of picture(图像组),指两个I帧之间的距离。

I帧、P帧、B帧实际顺序&&编码顺序:



三、H.264分层设计

H264算法在概念上分为两层:

    VCL:(Video Coding Layer)视频编码层,负责高效的内容表示。

    NAL:(Network Abstraction Layer)网络提取层,负责以网络所要求的恰当的方式对数据进行打包和传送。

    上面所学习的知识都是VCL层。

NAL设计的目的,是根据不同的网络把数据打包成相应的格式,将VCL产生的比特字符串适配到各种各样的网络和多元环境中。

NAL的封装方式:

    NAL是将每一帧数据写入到一个NAL单元中,进行传输或存储的

    NALU分为NAL头和NAL体

    NALU头通常为00 00 00 01,作为一个新的NALU的起始标识

    NALU体封装着VCL编码后的信息或者其他信息

NAL的封装过程:

    I帧、P帧、B帧都是被封装成一个或者多个NALU进行传输或者存储的

    每一个I帧开始之前也有非VCL的NAL单元,用于保存其他信息,它们是PPS、SPS

    PPS(Picture Parameter Sets):图像参数集

    SPS(Sequence Parameter Set):序列参数集

    在实际的H264数据帧中,往往帧前面带有00 00 00 01 或 00 00 01分隔符,一般来说编码器编出的首帧数据为PPS与SPS,接着为I帧,后续是B帧、P帧等数据

直播一:H.264编码基础知识详解的更多相关文章

  1. Cisco路由技术基础知识详解

    第一部分 请写出568A的线序(接触网络第一天就应该会的,只要你掐过,想都能想出来) .网卡MAC地址长度是(  )个二进制位(16进制与2进制的换算关系,只是换种方式问,不用你拿笔去算) A.12  ...

  2. RabbitMQ基础知识详解

    什么是MQ? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中 ...

  3. RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙

    消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...

  4. Python基础知识详解 从入门到精通(七)类与对象

    本篇主要是介绍python,内容可先看目录其他基础知识详解,欢迎查看本人的其他文章Python基础知识详解 从入门到精通(一)介绍Python基础知识详解 从入门到精通(二)基础Python基础知识详 ...

  5. 第157天:canvas基础知识详解

    目录 一.canvas简介 1.1 什么是canvas?(了解) 1.2 canvas主要应用的领域(了解) 二.canvas绘图基础 2.0 sublime配置canvas插件(推荐) 2.1 Ca ...

  6. Thrift入门初探(2)--thrift基础知识详解

    昨天总结了thrift的安装和入门实例,Thrift入门初探--thrift安装及java入门实例,今天开始总结一下thrift的相关基础知识. Thrift使用一种中间语言IDL,来进行接口的定义, ...

  7. 【干货】用大白话聊聊JavaSE — ArrayList 深入剖析和Java基础知识详解(二)

    在上一节中,我们简单阐述了Java的一些基础知识,比如多态,接口的实现等. 然后,演示了ArrayList的几个基本方法. ArrayList是一个集合框架,它的底层其实就是一个数组,这一点,官方文档 ...

  8. Java网络编程一:基础知识详解

    网络基础知识 1.OSI分层模型和TCP/IP分层模型的对应关系 这里对于7层模型不展开来讲,只选择跟这次系列主题相关的知识点介绍. 2.七层模型与协议的对应关系 网络层   ------------ ...

  9. mysql基础知识详解

    分享一些mysql数据库的基础知识. 1.每个客户端连接都会从服务器进程中分到一个属于它的线程.而该连接的相应查询都都会通过该线程处理.2.服务器会缓存线程.因此并不会为每个新连接创建或者销毁线程.3 ...

随机推荐

  1. .11-Vue源码之patch(1)

    最近太鸡儿忙了!鸽了一个多月,本来这个都快完了,拖到现在,结果我都不知道怎么写了. 接着上节的话,目前是这么个过程: 函数大概是这里: // line-3846 Vue.prototype._rend ...

  2. JS实现移动端购物车左滑删除功能

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  3. Linux crontab定时器设置(定期执行java程序)(转)

    Crontab 语法 Crontab语法一个crontab文件用五个段来定义:天,日期和时间,和一个要定期执行的命令代码. *    *  *  *   *  command to be execut ...

  4. 通过网络路径获取的图片 btye 图片流互转

    楼主有一个需要用户用的网站要上传图片,图片不保存到网站,而是要专门存放到一个图片服务器上面,于是需要通过byte的形式来传输 之前写的一个本地图片流转于byte互转 后来发现通过网络路径获取的图片这个 ...

  5. 数据模型(LP32 ILP32 LP64 LLP64 ILP64 )

    数据模型(LP32 ILP32 LP64 LLP64 ILP64 ) 32位环境涉及"ILP32"数据模型,是因为C数据类型为32位的int.long.指针.而64位环境使用不同的 ...

  6. You can Solve a Geometry Problem too(判断两线段是否相交)

    You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3 ...

  7. 第三章 CUDA设备相关

    这章介绍了与CUDA设备相关的参数,并给出了了若干用于查询参数的函数. 章节代码(已合并): #include <stdio.h> #include "cuda_runtime. ...

  8. 注销/etc/passwd带来的系统登陆不上

    今天在修改虚拟机密码上的时候,将/etc/passwd中root所在的哪行注销掉了,想象是注销了,root登陆时应该不要输入密码,结果是系统进度条走到最后的时候 进入不了系统了. 结果去普及了下/et ...

  9. AMD与commonJS

    CommonJS:它是一个同步的模式.但是这种模式并不适合于浏览器端,如果浏览器同步模式一个一个加载模块,那么打开将会变得非常的慢. AMD:它最大的特点就是可以异步的方式加载模块,具体的不同在于AM ...

  10. rewirte 规则

    Nginx Rewrite Rewirte 规则也称为规则重写,主要功能是实现浏览器访问 HTTP URL 的跳转,其正则 表达式是基于 Perl 语言.通常而言,几乎所有的 WEB 服务器均可以支持 ...