H.264及编解码调试
H.264及编解码调试
H.264是国际标准化组织(ISO)和国际电信联盟(ITU)在2002年12月共同提出的继MPEG-4之后的新一代数字视频压缩格式,其具有更高的编码效率,并注重对移动和IP网络的适应,考虑信道的特点,能控制误码扩散。
本文将简单介绍H.264编码的原理,并使用JM 18.61进行编解码器的调试。
一. H.264简介
1. H.264的特点2
- 压缩比高:在同等图像质量的条件下,采用H.264技术压缩后的码流,数据量只有MPEG-2的1/2;
- 容错率高:H.264码流具有较强的抗误码特性,可适应丢包率高、干扰严重的信道,如IP和无线网络;
- 网络适应性强:H.264提供了网络适应层,使得H.264的文件能容易地在不同网络上传输;
- 计算复杂度高:H.264使用较高的计算复杂度,换取优越的性能,其复杂度相当于MPEG-2的2—3倍。
2. H.264编解码器
H.264编码器结构与前代MPEG-2标准差别不大,均主要采用变换编码、DPCM与运动补偿的混合结构。编解码器的结构如图1-1所示。
3. H.264采用的先进技术
(1) 分层设计
H.264在视频编码层(VCL)和网络提取层(NAL)之间进行概念分割,以实现在不同的传输环境下的有效传输,便于与当前和将来的编码格式和不同类型的网络进行无缝连接。分层结构如图1-2所示。
(2) 帧内预测编码
根据邻近块的值来预测当前宏块的值,再对预测值和原始值的差值进行变换、量化和编码。对于亮度块,使用4×4与16×16编码模式,对色度块采用8×8编码模式。
以亮度块的4×4帧内预测模式为例,由周围的15个像素预测4×4的16个像素,共有9种预测模式,分别计算各自的SAE,以最小者作为该块的预测模式。
(3) 帧间预测编码——基于块的运动补偿
- 树状结构运动补偿:使用不同大小和形状的块进行运动补偿(低频区域使用大块,高频区域使用小块);
- 使用1/4像素精度运动矢量
- 在多个参考帧中进行运动搜索,选择一个与编码帧最相似的帧作为参考帧
- 引入SI帧和SP帧:适应码流带宽自适应和抗误码的要求,改善网络亲和性,支持流媒体服务
(4) 整数变换
使用整数DCT代替MPEG-2中的DCT,保证变换中无精度损失,且标准中对正反变换有详细说明,不会出现误匹配。另外,整数变换仅需要移位和加法,最大程度提高运算效率。
(5) 量化处理
H.264标准支持52个量化步长,量化参数QP每增加6,量化步长Qstep增加一倍。量化步长取值范围很广,这就为编码中兼顾比特率和编码质量提供了足够多的灵活度和准确度。
(6) 去块效应滤波
为消除块效应,H.264编码系统的预测环路中增加了自适应去块效应滤波器。
(7) 熵编码
H.264标准中给出了两种熵编码方法:CAVLC(Context-based Adaptive Variable Length Coding,基于上下文的自适应可变长编码)和CABAC(Context-based Adaptive Binary Arithmetic Coding,基于上下文的自适应二进制算术编码),其中前者为基本编码方法,后者可选编码方法,且后者的编码性能相较于前者较好,但计算复杂度更高。
4. 概念说明
为了便于理解后面JM编码器的相关内容,这里将MPEG-2中包含的、但在H.264中略有区别的一些概念再做一下说明。
(1) 视频编码帧
- I帧(Intra Frame,帧内编码帧):只使用本阵内的数据进行编码(DCT、量化、熵编码),压缩比较低,约为(2—5):1。此外还有IDR帧(Instantaneous Decoding Refresh Frame),是GOP的第一个I帧(一种特殊的I帧)。IDR帧之后的所有帧都不能参考IDR帧之前帧的内容(而位于普通的I帧之后的P/B帧可以参考其之前的I帧),也就是说,从IDR帧开始,重新算一个新的序列开始编码,因而播放器永远可以从一个IDR帧开始播放,因为在其之后没有对于任何其之前帧的参考。3
- P帧(Predictive Frame,前向预测编码帧):以前面最靠近的I帧或P帧作为参考进行前向预测编码。
- B帧(Bidirectional Predictive Frame,双向预测编码帧):以一个前面的参考帧和一个后面的参考帧进行双向预测编码。2
(2) GOP
GOP(Group of Pictures,图像组)是将一个图像序列中连续的几个图像组成的一个小组,是对编码后的视频码流进行编辑、存取和压缩编码的基本单元,包含不同种类编码的帧。2
GOP大小不固定,但GOP一定以I帧开始,但每个GOP可能包含多个I帧。
增大GOP或提高GOP中P/B帧的占比,可以提高压缩比,降低码率。因此一般而言,在码率一定的条件下,GOP越大,图像质量越好(P/B帧的比重更大);在图像质量一定的条件下,GOP越大,码率越低。
闭合GOP(Closed GOP)与开放GOP(Open GOP):在H.264的GOP中,所有的GOP都是独立解码的,与其他GOP无关,即它们都是“闭合”的。但是在HEVC中,GOP的结构发生了变化,采用了“开放”的结构,在解码过程过可能会参考其他GOP的数据。4
(3) 帧重排
由于B帧是双向预测帧,因此在后向预测时,需要以其后面的P或I帧作为参考,因此需要将原始图像顺序重新排序后送入编码器2,如图1-5所示。(图1-4表示的是播放顺序。)
二. H.264解码器调试
在ldecod项目中,打开decoder_test.c
,可以修改输入和输出文件名,如:
#define BITSTREAM_FILENAME "highway_qcif.264"
#define DECRECON_FILENAME "highway_qcif_dec.yuv"
即可将.264文件解码为.yuv文件。
三. H.264编码
1. 编码参数
部分需要调整的编码参数的含义如下表所示。
行 | 参数 | 含义 | 取值 |
---|---|---|---|
13/56/57 |
InputFile /OutputFile /ReconFile
|
输入文件/ 输出文件(.264)/ 重建文件(.yuv) |
|
30/31/ 33/34 |
SourceWidth /SourceHight /OutputWidth /OutputHeight
|
输入、输入视频序列的宽、高 | |
16 |
FramesToBeEncoded
|
编码帧数 | |
72 |
IntraPeriod
|
GOP内I帧的周期 | 0表示仅GOP的第一帧为I帧 |
73 |
IDRPeriod
|
IDR帧的周期,表示GOP长度 | 0表示仅GOP的第一帧为I帧 |
77 |
EnableIDRGOP
|
是否允许IDR帧 | 0为禁用,1为允许 |
78 |
EnableOpenGOP
|
是否允许开放GOP | 0为禁用,1为允许 |
180 |
NumberBFrames
|
两个I/P帧之间B帧的数目 | |
347 |
PrimaryGOPLength
|
GOP length for redundant allocation (1-16) | |
444 |
RateControlEnable
|
是否允许比特率控制 | 0为禁用,1为允许 |
445 |
Bitrate
|
比特率(单位:bps) | |
453 |
RCUpdateMode
|
全I帧模式适用模式1,其他情况适用模式2或3,本实验选择2 |
0:原始的JM率控制; 1:对所有帧都适用的码率控制算法; 2:在1的基础上考虑到I/P Slices的量化参数; 3: 混合二次码率控制算法,即在控制过程中考虑到实时的码率情况 |
有关IntraPeriod
、IDRPeriod
、NumberBFrames
、PrimaryGOPLength
之间的优先级关系:
IDRPeriod
决定了GOP的长度,而IntraPeriod
只决定了GOP内两个I帧之间的距离,因而后者小于前者(若后者大于等于前者,则均相当于IntraPeriod
= 0)。故优先级:IDRPeriod
>IntraPeriod
;NumberBFrames
决定了两个I/P帧之间的B帧数量,但只有在NumberBFrames
≤IntraPeriod
时才有效,即优先级:IntraPeriod
>NumberBFrames
;PrimaryGOPLength
一般设置为与IDRPeriod
相同;即便不相同,也不对码流产生影响。故优先级:IDRPeriod
>PrimaryGOPLength
以上结论可以通过与下面的例子结合理解(NumberBFrames
均设为2):
# |
IntraPeriod
|
IDRPeriod
|
PrimaryGOPLength
|
GOP | 备注 |
---|---|---|---|---|---|
1 | 0 | 15 | 15 |
IBBPBBPBBPBBPBP
|
|
2 | 11 | 15 | 15 |
IBBPBBPBBPBIBBP
|
|
3 | 18 | 15 | 15 |
IBBPBBPBBPBBPBP
|
与1结果相同 |
4 | 2 | 15 | 15 |
IBIBIBIBIBIBIBI
|
|
5 | 11 | 15 | 12 |
IBBPBBPBBPBIBBP
|
与2结果相同 |
2. 编码器调试
在下面的实验中,我们均设定IntraPeriod
= 0,PrimaryGOPLength
= IDRPeriod
,以控制变量。
分别选择比特率为1600、1650、1700、1750、1800 kbps,再对每一比特率分别设置GOP格式为GOP15(2B)、GOP12(2B)、GOP9(2B)、GOP4(1B)、GOP12(无B)和GOP1(全I)进行编码。
运行lencode项目,对miss.yuv进行编码,运行结果如下:
以GOP12(0B)@1800 kbps的情况为例,从表格中可以看到GOP大小为12,并且可以看到帧重排。
四. 结果分析
1. 码流分析
下面使用Elecard StreamEye Tools码流分析软件对编码后的内容进行分析。
以GOP15(2B)的情况为例:
图中每个矩形代表一帧(红、蓝、绿分别表示I、P、B帧),我们可以清楚地看出编码后视频的码流结构并且可以看到有帧重排(显示顺序为IBBPBBPBBPBBPBP)。
下面我们以其中的4帧(I、B、B、P)进行分析。
我们在预览中打开显示宏块分界线、宏块类型和运动矢量。
画面中,红色、橙色宏块均使用帧内编码(宏块大小略有不同);黄色宏块类型为Inter(B_Skip),表示与前一帧相同,跳过不编码;绿色宏块使用前向预测编码,蓝色宏块使用双向预测编码。
在图4-2中,我们可以看到:
- 4帧的背景部分变化均很小,因而背景部分均没有进行编码;
- B、P帧中可看到运动矢量。红色线表示前向预测,绿色线表示后向预测,因此P帧中只有红色线,I帧使用帧内编码,无运动矢量;
- 通过宏块分界线我们还可以看到H.264中不同形状、不同大小的宏块,且在低频区域的宏块更大。这也是前面提到的H.264采用的先进技术之一。
2. 视频质量客观评价
下面我们对前面编码得到的6中GOP结构的5种比特率的H.264文件进行视频质量客观评价,评价指标采用Y分量的PSNR (dB)。由于编码后H.264文件的实际比特率与目标比特率之间有一定误差,因此我们以实际比特率进行率失真曲线的绘制。
从图中可以看到,在码率相同的前提下,视频质量由好到差为:GOP12 (0B) > GOP15 (2B) > GOP12 (2B) > GOP9 (2B) > GOP4 (1B) > GOP1 (all-I)。
下表中列出了6中GOP结构各自的I、P、B帧的占比。例如我们可以比较GOP15(2B)和GOP12(2B),二者P帧占比相同,而前者的B帧占比更大,因而具有更好的图像质量。视频质量相同的前提下,可以进行类比分析,这里不再赘述。
GOP结构 | I帧占比 | P帧占比 | B帧占比 | 视频质量排序 | |
---|---|---|---|---|---|
GOP12 (0B) |
IPPPPPPPPPPP
|
8.3% | 91.7% | 0% | 1 |
GOP15 (2B) |
IBBPBBPBBPBBPBP
|
6.7% | 33.3% | 60% | 2 |
GOP12 (2B) |
IBBPBBPBBPBP
|
8.3% | 33.3% | 58.3% | 3 |
GOP9 (2B) |
IBBPBBPBP
|
11.1% | 55.5% | 55.5% | 4 |
GOP4 (1B) |
IBPP
|
25% | 25% | 50% | 5 |
GOP1 (all-I) |
I
|
100% | 0% | 0% | 6 |
3. 视频质量主观评价
由于我们无法得到实际码率严格相等的一组H.264码流,因此我们只能在同一种GOP结构下进行不同码率的主观评价。以GOP12(2B)为例:
事实上,由于相邻两张之间码率只相差大约500 kbps,因此很难看出有差别,即便是最高和最低码率之间的对比,也几乎无差异。
参考资料
Karsten Suehring ↩︎
《数字电视广播原理与应用》 ↩︎ ↩︎ ↩︎ ↩︎
I帧 B帧 P帧 IDR帧的区别 ↩︎
【HEVC学习与研究】8.关于GOP与RAP的一些解释] ↩︎
H.264及编解码调试相关推荐
- H.264视频编解码的FPGA源码分析(一)输入数据分析
目录 概要 输入数据 宏块 概要 本文的源码基于复旦大学的开源芯片-开源H.265/H.264视频编码器项目,本文的工作主要是在梳理源码的同时学习H.264视频编解码的原理及其硬件实现. 输入数据 C ...
- H.264视频编解码的FPGA源码分析(二)帧内预测1
目录 帧内预测算法原理 基于论文的普通介绍 硬件实现 亮度块与色度块的划分 4×4亮度预测模块 如何产生预测像素与残差像素? 垂直模式`INTRA4x4_V` 水平模式`INTRA4x4_H` 直流模 ...
- 音视频编解码技术(一):MPEG-4/H.264 AVC 编解码标准
一.H264 概述 H.264,通常也被称之为H.264/AVC(或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC) 1. H.264视频编解码的意义 H.264的出现就是为了创 ...
- 数据压缩12 | 实验8 | H.264视频编解码
目录 一.实验准备 1. H.264编码过程 2. 调试和编码(参考JM Reference Software Manual (JVT-AE010)) 3. 编码参数(参考JM Reference S ...
- H.264视频编解码的代码移植和优化
基于DSP系统开发的视频编解码系统,国内几乎都是走的移植,优化的路线,并且移植的代码,都是开源的.毕竟花费大量的人力,物力去开发一套自己的代码,并不见得比一些成熟的开源代码效率更高,健壮性更好.更何况 ...
- H.264的编解码流程
H.264是在MPEG-4技术的基础之上建立起来的,其编解码流程主要包括5个部分:帧间和帧内预测(Estimation).变换(Transform)和反变换.量化(Quantization)和反量化. ...
- 【音视频】Ubuntu安装开源H.264标准编解码库x264
1 x264 x264是基于H.264/AVC标准的一款免费.开源的视频编解码器(库),x264是目前使用最广的.最优秀的一款H.264编解码器.x264编解码器支持的功能众多,包括: 8x8与 ...
- 解析H.264视频编解码DSP实现与优化
引言 基于互联网的数字视频产业前景看好,而3G的规模部署,也会推动移动视频通信成为现实.但数字化后的视频图像具有数据海量性,给图像的存储和传输造成较大的困难.数字视频产业,是指数字内容中以数字视频形态 ...
- H.264码流分析及编解码调试
一.H.264码流分析 1. 选择一个.mp4或者.264文件. 2. 在码流分析仪软件中打开该文件,从几个层次进行分析: (1) 分析SPS和PPS里都包含哪些主要的信息,给出参数值.(例如分辨率. ...
最新文章
- Linux字符界面操作进阶
- OpenCV hdr成像技术的实例(附完整代码)
- NCNE二级复习资料-网络监视、管理和排错
- 申请信用贷款需要哪些条件?
- 因云而生 全新视角看阿里云服务器硬件方升架构
- const、extern、static的使用不再神秘
- 自定义刻度_想为 Apple Watch 打造自定义表盘,试试这款 App
- word2003如何设置护眼模式_word2003护眼色设置
- 世界芯中国芯RISC-V相关资源及进展
- sql server 2008新建视图时出现对象名无效
- rc4加密问题漏洞修复_服务器SSL不安全漏洞修复方案
- 《大明王朝》掠之于官
- Android 包大小优化总结
- Android微信支付遇到的大坑
- 不同按钮进入同一个页面显示不同的div
- [转] 懒惰、急躁和傲慢 (Laziness, Impatience and hubris)
- 小程序无限插屏广告实现方法
- 编写一个程序,输入一个正整数,并做以下运算:如果为偶数,除以2,如果为奇数乘3加1.得到结果按上述要求,直到最后结果为1,一共要经过多少次这样的运算才得到数1
- Windows快捷键的使用
- 每天有2800万人在看片