一、H.264视频编码标准

H.264视频编码标准是ITU-T与MPEG合作产生的又一巨大成果,自颁布之日起就在业界产生了巨大影响。严格地讲,H.264标准是属于MPEG-4家族的一部分,即MPEG-4系列文档ISO-14496的第10部分,因此又称作MPEG-4/AVC。同MPEG-4重点考虑的灵活性和交互性不同,H.264着重强调更高的编码压缩率和传输可靠性,在数字电视广播、实时视频通信、网络流媒体等领域具有广泛的应用。

二、H.264视频编码方法简介

在整体的编码框架方面,H.264依然采用了与前期标准类似的结构,即块结构的混合编码框架。其主要结构图如下图所示:



在H.264进行编码的过程中,每一帧的H图像被分为一个或多个条带(slice)进行编码。每一个条带包含多个宏块(MB,Macroblock)。宏块是H.264标准中基本的编码单元,其基本结构包含一个包含16×16个亮度像素块和两个8×8色度像素块,以及其他一些宏块头信息。在对一个宏块进行编码时,每一个宏块会分割成多种不同大小的子块进行预测。帧内预测采用的块大小可能为16×16或者4×4,帧间预测/运动补偿采用的块可能有7种不同的形状:16×16、16×8、8×16、8×8、8×4、4×8和4×4。相比于早期标准只能按照宏块或者半个宏块进行运动补偿,H.264所采用的这种更加细分的宏块分割方法提供了更高的预测精度和编码效率。在变换编码方面,针对预测残差数据进行的变换块大小为4×4或8×8(仅在FRExt版本支持)。相比于仅支持8×8大小的变换块的早期版本,H.264避免了变换逆变换中经常出现的失配问题。

H.264标准中采用的熵编码方法主要有上下文自适应的变长编码CAVLC和上下文自适应的二进制算数编码CABAC,根据不同的语法元素类型指定不同的编码方式。通过这两种熵编码方式达到一种编码效率与运算复杂度之间的平衡。

同前期标准类似,H.264的条带也具有不同的类型,其中最常用的有I条带、P条带和B条带等。另外,为了支持码流切换,在扩展档次中还定义了SI和SP片。

  • I条带:帧内编码条带,只包含I宏块;
  • P条带:单向帧间编码条带,可能包含P宏块和I宏块;
  • B条带:双向帧间编码条带,可能包含B宏块和I宏块;

三、H.264标准采用的编码工具

在H.264中使用的编码技术主要有以下类型:

帧内预测

H.264中采用了基于像素块的帧内预测技术。主要可分为以下不同类型:

  • 16×16大小的亮度块:4种预测模式
  • 4×4大小的亮度块:9种预测模式
  • 色度块:4种预测模式,同16×16的亮度块

16×16亮度块和色度块的4种预测模式如下图:

4×4亮度块的9种预测模式如下图表示:

帧间预测

H.264中的帧间预测方法采用了基于块的运动估计和补偿方法,其主要特点有:

  • 多个候选参考帧;
  • B帧作为参考帧;
  • 任意参考帧排序;
  • 多种运动补偿像素块形状,包括16×16、16×8、8×16、8×8、8×4、4×8和4×4像素;
  • 1/4像素(亮度)的亚像素插值;
  • 对交错视频的基于帧或场的运动估计;

进行帧间预测的宏块进行子宏块分割的方式如图所示:



亚像素插值的表示如下图。其中红色点表示图像中的整像素点的位置,绿色点表示两个正像素之间的1/2像素插值的位置,紫色点表示1/4像素插值的位置。

交错视频编码

针对隔行扫描的视频,H.264专门定义了用于处理此类交错视频的算法。

  • PicAFF:Picture Adaptive Frame Field——图像层的帧场自适应;
  • MBAFF:MacroBlock Adaptive Frame Field——宏块层的帧场自适应;

变换和量化编码

H.264的变换编码创新性地采用了类DCT的整数变换,有效降低了运算复杂度。对于基础版H.264,变换矩阵为4×4;在FRExt扩展中,还支持8×8的变换矩阵。

H.264的量化算法仍然采用标量量化方法。

无损熵编码算法

H.264标准针对不同的语法元素指定了不同的熵编码算法,主要有:

  • UVLC(Universal Variable Length Coding):主要采用指数哥伦布编码;
  • CAVLC(Context Adaptive Variable Length Coding):上下文自适应的变长编码;
  • CABAC(Context Adaptive Binary Arithmetic Coding):上下文自适应的二进制算数编码;

【视频编解码·学习笔记】2. H.264简介的更多相关文章

  1. 视音频编解码学习工程:H.264分析器

    =====================================================视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习工 ...

  2. 【视频编解码·学习笔记】11. 提取SPS信息程序

    一.准备工作: 回到之前SimpleH264Analyzer程序,找到SPS信息,并对其做解析 调整项目目录结构: 修改Global.h文件中代码,添加新数据类型UINT16,之前编写的工程中,UIN ...

  3. 【视频编解码·学习笔记】3. H.264视频编解码工程JM的下载与编解码

    一.下载JM工程: JM是H.264标准制定团队所认可的官方参考软件.网址如下 http://iphome.hhi.de/suehring/tml/ 从页面中可找到相应的工程源码,本次选择JM 8.6 ...

  4. 【视频编解码·学习笔记】6. H.264码流分析工程创建

    一.准备工作: 新建一个VS工程SimpleH264Analyzer, 修改工程属性参数-> 输出目录:$(SolutionDir)bin\$(Configuration)\,工作目录:$(So ...

  5. 【视频编解码·学习笔记】4. H.264的码流封装格式

    一.码流封装格式简单介绍: H.264的语法元素进行编码后,生成的输出数据都封装为NAL Unit进行传递,多个NAL Unit的数据组合在一起形成总的输出码流.对于不同的应用场景,NAL规定了一种通 ...

  6. 【视频编解码·学习笔记】4. H.264的码流封装格式 & 提取NAL有效数据

    一.码流封装格式简单介绍: H.264的语法元素进行编码后,生成的输出数据都封装为NAL Unit进行传递,多个NAL Unit的数据组合在一起形成总的输出码流.对于不同的应用场景,NAL规定了一种通 ...

  7. 【视频编解码·学习笔记】8. 熵编码算法:基本算法列举 & 指数哥伦布编码

    一.H.264中的熵编码基本方法: 熵编码具有消除数据之间统计冗余的功能,在编码端作为最后一道工序,将语法元素写入输出码流 熵解码作为解码过程的第一步,将码流解析出语法元素供后续步骤重建图像使用 在H ...

  8. 【视频编解码·学习笔记】5. NAL Unit 结构分析

    在上篇笔记中通过一个小程序,可以提取NAL Unit所包含的的字节数据.H.264码流中的每一个NAL Unit的作用并不是相同的,而是根据不同的类型起不同的作用.下面将对NAL Unit中的数据进行 ...

  9. 【视频编解码·学习笔记】10. 序列参数集(SPS)介绍

    一.SPS 相关概念: SPS即 "Sequence Paramater Set",又称作序列参数集. SPS中保存了一组编码视频序列(Coded video sequence)的 ...

随机推荐

  1. 在macOS上通过pyenv安装和切换多版本Python

    1. 安装homebrew 官网 http://brew.sh/index_zh-cn.html 打开终端,在终端中粘贴如下脚本 /usr/bin/ruby -e "$(curl -fsSL ...

  2. Linux学习笔记整理

    2.1BASH命令行基本操作 [用户@主机~]$ # //$#为提示符 $代表普通用户 #代表root用户 ~代表当前目录 ls   //list相当于DOS的dir 显示当前目录列表 -a   // ...

  3. js 类数组arguments详解

    arguments并不是一个真正的数组,而是一个"类似数组(array-like)"的对象: 就像下面的这段输出,就是典型的类数组对象: [, , callee: ƒ, Symbo ...

  4. winform展示Unity3D文件(支持动态改变文件路径)

    winform下展示Unity3D文件可以支持对Unity3D实现的模块进行包装,以及在其他的项目中需要展示Unity3D的界面时候,恰到适宜地进行打开展示,这里我展示如何使用winform打开Uni ...

  5. FFmpeg AVPacket

    AVPacket注解 AVPacket 是一个结构体,存储压缩数据.可作为编码器的输出,解码器的输入. 对于 Video 一般包含一个压缩帧,对于 Audio 可能包含多个压缩帧. 编码器允许输出空 ...

  6. CI_SMOKE配置手册

    1.1.  SVN安装 安装TortoiseSVN,并检出AutoScript目录至本地 1.2.  Java环境安装 确认测试环境安装了JDK,在cmd下键入java -version 检查JDK是 ...

  7. ADO对SQL Server 2008数据库的基础操作

    最近在学习ADO与数据库的相关知识,现在我将自己学到的东西整理写出来,也算是对学习的一种复习. 这篇文章主要说明如何遍历某台机器上所有的数据库服务,遍历某个服务中所有的数据库,遍历数据库中的所有表以及 ...

  8. JavaScript(三) 数据类型

    数据类型 5+1种数据类型 5种 基础数据类型 Number String boolean null undefined 1种 复杂数据类型 object typeof 操作符   typeof 操作 ...

  9. 【转载】Linux cgroup资源隔离各个击破之 - io隔离

    Linux Cgroup blkio子系统的用法.   blkio子系统支持的两种IO隔离策略 .1. (Completely Fair Queuing 完全公平队列)cfq io调度策略,支持按权重 ...

  10. mongodb 的基本函数语法封装

    //这个模块里面封装了所有对数据库的常用操作 var MongoClient = require('mongodb').MongoClient; var config = require(" ...