H.264编解码程序调试(JM18.6)_h.264 jm 18.6-程序员宅基地

技术标签: c语言  h.264  Experiment  编码器  编程语言  

H.264介绍

H.264是由ITU-T视频编码专家组(VCEG)和ISO/IEC运动图像专家 组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的新一代数字视频压缩标准。与之前的标准一样,同样采用了帧内预测,运动预测,变换编码,熵编码结合的方法(这些方面和之前的标准一致,即混合编码器的基本框架),同时在此基础上做出一定改动(主要改动集中在功能模块的具体细节上),以适应更高的编码效率,更简洁的表达形式等要求。

在应用方面,H.264更注重对移动和IP网络的适应,采用分层技术将编码和信道分离开(实际上是在编码过程中更注重对信道条件的考虑)。

此外,H.264并没有规定一个标准的编解码器,定义的是定义的是编码视频比特流的语法结构和对该比特流解码的方法。大体框架于之前的标准(如MPEG-2)相比没有改变。以下为一种编解码器示例:

在这里插入图片描述在这里插入图片描述

与之前标准一样,H.264定义了不同的型和级,此外H.264的编码基本单元不是宏块,而是片(Slice),一个视频图像划分为数个片,每个片包含整数个宏块。

H.264特点

  • 编码效率高 相同图像质量下编码效率为MPEG-2的2倍以上
  • 容错能力强 提供流畅的高质量图像(DVD)
  • 网络适应性好 网络抽象层NAL提供了强网络适应性
  • 计算复杂度高 功能模块细节上设定更复杂,导致计算复杂度提高

与之前的标注相比相比使用的先进技术有:

分层设计

编码方案主要有视频编码层和网络抽象层组成,编码和信道分离。

帧内预测编码

根据邻近块的值来预测当前宏块的值,然后再对预测值和原始值的差值进行变换、量化和编码。具体预测方案分为亮度块的4x4和16x16模式,色度块的8x8模式。,每个模式各自有不同的预测模型。

帧间预测编码

在基于块的运动补偿基本思想下有如下改动:

  • 使用不同大小和形状的块进行搜索
  • 搜索精度提高到1/4像素
  • 多个预测帧进行帧间预测
  • 引入SP,SI帧,适应带宽自适应和抗误码的要求
整数变换

实际上仍为DCT变换。以Baseline为例,对不同的数据进行不同的整数变换:4x4的残差数据块变换,4x4的亮度DC系数块变换,2x2的色度DC系数块变换。

量化处理

H.264标准支持52个量化步长,对应于不同的量化参数(QP)如表所示,QP值每增加6,Qstep值增加一倍。量化步长取值范围很广,这就为编码中兼顾比特率和编码质量提供了足够多的灵活度和准确度。

去块效应滤波

H.264/AVC定义了一个自适应循环滤波器,滤波的强度通过几个语法元素控制。滤波的基本思想是:如果块边沿的绝对差值相对比较大,出现块人工瑕疵的可能性就很大, 因此需要进行相应处理。

熵编码

H.264提供的熵编码方案有:通用变长码编码UVLC,基于上下文的自适应变长编码CAVLC,基于上下文的自适应二进制算术编码CABAC。

实验内容

根据程序参考手册JM Reference Software Manual可知,jm_vc10.sln程序的编解码参数在encoder.cfg,encoder_yuv422.cfg,decoder.cfg中,根据实验具体要求修改其具体内容。

H.264解码

将实验提供的264格式文件解码为raw格式的yuv文件。修改相应输入输出输出文件参数即可,其他参数设定默认。以highway_qcif.264(176X144,4:2:0)为例:

decoder.cfg

# New Input File Format is as follows
# <ParameterName> = <ParameterValue> # Comment
#
##########################################################################################
# Files
##########################################################################################
InputFile             = "highway_qcif.264"       # H.264/AVC coded bitstream
OutputFile            = "highway_qcif_dec.yuv"   # Output file, YUV/RGB
RefFile               = "highway_qcif_rec.yuv"   # Ref sequence (for SNR)
WriteUV               = 1                # Write 4:2:0 chroma components for monochrome streams
FileFormat            = 0                # NAL mode (0=Annex B, 1: RTP packets)
RefOffset             = 0                # SNR computation offset
POCScale              = 2                # Poc Scale (1 or 2)
##########################################################################################
# HRD parameters
##########################################################################################
#R_decoder             = 500000           # Rate_Decoder
#B_decoder             = 104000           # B_decoder
#F_decoder             = 73000            # F_decoder
#LeakyBucketParamFile  = "leakybucketparam.cfg" # LeakyBucket Params
##########################################################################################
# decoder control parameters
##########################################################################################
DisplayDecParams       = 1                # 1: Display parameters; 
ConcealMode            = 0                # Err Concealment(0:Off,1:Frame Copy,2:Motion Copy)
RefPOCGap              = 2                # Reference POC gap (2: IPP (Default), 4: IbP / IpP)
POCGap                 = 2                # POC gap (2: IPP /IbP/IpP (Default), 4: IPP with frame skip = 1 etc.)
Silent                 = 0                # Silent decode
IntraProfileDeblocking = 1                # Enable Deblocking filter in intra only profiles (0=disable, 1=filter according to SPS parameters)
DecFrmNum              = 0                # Number of frames to be decoded (-n)
##########################################################################################
# MVC decoding parameters
##########################################################################################
DecodeAllLayers        = 0                 # Decode all views (-mpr)

DisplayDecParams设为1,以便运行时显示相关参数。

H.264编码

将上述得到的raw格式重新编码为H.264格式,具体要求为:

1.固定码率,以不同的GOP长度及形状编码

GOP=15,2B帧;GOP=12,2B帧;GOP=9,2B帧

GOP=4,1B帧;GOP=12,无B帧;GOP=1,全I帧

一般来说,在相同码率下,GOP越长,即P,B帧的比重更大,视频的质量越好。

2.相同的GOP长度及形状,不同的码率

例:1000kb/s, 800kb/s,400kb/s,…

在相同GOP条件下,码率提高,I帧越多,视频质量越低。

同样,上述参数可以通过修改参数文件实现,编码参数文件为encoder.cfg。

GOP相关参数

这里首先要分清楚IDR帧和I帧,每个GOP中只有一个IDR帧,它界定了GOP与GOP之间互不干扰。

然而一个GOP中可以有多个I帧。根据具体情况本次实验中设置1个GOP中1个I帧,即IDR帧,所以IDRPeriod也是应与GOP长度一致,如下:

IntraPeriod           = 0   # Period of I-pictures   (0=only first)
IDRPeriod             = 12   # Period of IDR pictures (0=only first)

此外在配置文件中可以看到由两种不同的GOP模式,IDR-GOP和open GOP,分别对应了有IDR帧界定GOP的方式和开放GOP方式,显然我们选择前者,为此设置一下参数:

EnableIDRGOP          = 1   # Support for IDR closed GOPs (0: disabled, 1: enabled)
EnableOpenGOP         = 0   # Support for open GOPs (0: disabled, 1: enabled)

此外,设置不同的B帧格式。

同时要控制不同的GOP长度,需要设置PrimaryGOPLength参数。

如GOP=12,2B帧,帧结构为IBBPBBPBBPBB,则设置NumberBFrames=2,PrimaryGOPLength=12。

要使用全I帧模式,即设置PrimaryGOPLength=1,NumberBFrames=0即可

同时还需要关闭B帧的Hierarchy编码模式。

NumberBFrames          = 2  # Number of B coded frames inserted (0=not used)
HierarchicalCoding     = 0  # B hierarchical coding (0= off, 1= 2 layers, 2= 2 full 								# hierarchy, 3 = explicit)
PrimaryGOPLength       = 12 # GOP length for redundant allocation (1-16)
码率相关参数

码率控制相关参数如下:

RateControlEnable       = 1     # 0 Disable, 1 Enable
Bitrate                 = 1000000 # Bitrate(bps)

此外对码率控制算法也有所要求,参数RCUpdateMode 提供了四种不同的码率控制算法:

RCUpdateMode            = 2     # Rate Control type. Modes supported :
                                # 0 = original JM rate control,
                                # 1 = rate control that is applied to all frames 										# regardless of the slice type,
                                # 2 = original plus intelligent QP selection for I and B 								 # slices (including Hierarchical),
                                # 3 = original + hybrid quadratic rate control for I and 								 # B slice using bit rate statistics

取值分别表示:

  • 0:原始的JM率控制
  • 1:对所有帧都适用的码率控制算法,对所有片的计算相同。
  • 2:在1的基础上考虑到I,P Slices的量化参数
  • 3: 混合二次码率控制算法,即在控制过程中考虑到实时的码率情况。

本次实验中对全I帧模式适用模式1,而有B,P帧使用模式2或3,这里选择模式2。

剩下还有输入输出图像宽高,文件名,编码帧数,帧率,TRACE设置等参数根据文件属性进行设置,在此不赘述。

通过调整配置文件参数运行文件,根据实验要求输出不同模式的H.264编码文件。

实验结果

H.264解码

设置参数后命令行直接运行生成的ldecod.exe文件即可:

在这里插入图片描述

命令行中输入I(IDR),P帧的相关信息,如POC(Picture Order Count),QP(Quantization Parameter)等。

在这里插入图片描述

SNR,解码时间,状态信息输出文件等。由于没有highway_qcif_rec.yuv输入作为参照,SNR无法计算。

生成文件highway_qcif_dec.yuv为解码生成的YUV文件。

在这里插入图片描述

H.264编码

highway_qcif帧数过多,选择另一样本进行编码实验。

对raw格式的hall_cif.yuv(352x288)用不同的GOP格式进行H.264编码,设置参数后直接在命令行运行lecode.exe即可。

运行过程中命令行会显示编码相关参数,各帧的编码信息等,如下图所示(15GOP,2B,1000kbps):

在这里插入图片描述

参数中比较重要的信息有帧序列结构Sequence Type,宽高数值,帧数帧率等。

下方帧编码信息中左侧Frame一列表示帧序号,可以看出编码顺序与帧序号不同,因为B帧的存在进行了帧重排。初次还有量化系数,bit信息量,作为参考帧等信息。

在这里插入图片描述

编码结束后会总结总编码时间,失真率等信息。其中Y分量的PSNR即本次实验需要的失真率曲线数据。

码流分析软件

用StreamEye软件可以对编码后的H.26码流进行分析,以15GOP,2B,1000kbps为例:

在这里插入图片描述

图中每一竖条代表一帧,红色为I帧,蓝色为P帧,绿色为B帧。15GOP2B的帧顺序为IBBPBBPBBPBBPBP,在此处由于本质上是将H.264码流进行解码分析,因此图中帧顺序为编解码顺序,即帧重排后的顺序,即IPBBPBBPBBPBBPB。

还可以查看码流相关参数信息,在此不赘述。

用软件可以查看每一帧的详细编码信息,以下以一组IBBP为例:

在这里插入图片描述

顺序为IBBP。

I帧中,进行帧内编码。

B帧中,黄色代表和参考帧无变化(B-skip),蓝色则代表可有由一定的残差数据从参考帧得到。

P帧中,红色橙色为帧内(Intra)MB,其大小的编码模式各有不同。蓝色为帧间MB.

在B,P帧中的点与点之间的一些线条代表了运动矢量。

由于H.264的预测算法特点,每个块的大小和预测模式各不相同。选定一个点可以查看该点代表的编码宏块的具体信息,包括宏块类型,预测模式,大小等。下图为选中的一个B帧中的黄色块:

在这里插入图片描述

这个块没有任何信息写进流中,因为这些信息可以在参考帧中找到,即B—skip。

码流质量

选择码流的最后一帧进行对比:

15GOP,2B 12GOP,2B
1000kbps 在这里插入图片描述 在这里插入图片描述
800kbps 在这里插入图片描述 在这里插入图片描述
400kbps 在这里插入图片描述 在这里插入图片描述
200kbps 在这里插入图片描述 在这里插入图片描述
100kbps 在这里插入图片描述 在这里插入图片描述
12GOP,0B 9GOP,2B
1000kbps 在这里插入图片描述 在这里插入图片描述
800kbps 在这里插入图片描述 在这里插入图片描述
400kbps 在这里插入图片描述 在这里插入图片描述
200kbps 在这里插入图片描述 在这里插入图片描述
100kbps 在这里插入图片描述 在这里插入图片描述
4GOP,1B 1GOP,0B
1000kbps 在这里插入图片描述 在这里插入图片描述
800kbps 在这里插入图片描述 在这里插入图片描述
400kbps 在这里插入图片描述 在这里插入图片描述
200kbps 在这里插入图片描述 在这里插入图片描述
100kbps 在这里插入图片描述 在这里插入图片描述

结果可得,码率越高视频质量越高,且上述GOP格式视频质量由好到差。

在较低码率范围,码率提高,视频质量将显著提高。

此外,由于raw格式中有一定的背景噪音,当GOP长度提高,背景噪声的变化周期边长,当然码率提高,视频质量提高后噪声会越来越不容易察觉。

失真率曲线

本次实验选用Y分量的PSNR作为失真率标准,曲线如下:

在这里插入图片描述

由图可知,1GOP,0B(全I帧)和4GOP,1B两种模式和其他模式的视频质量差距较大,这从之前的视频质量观察中肉眼也可看出。剩下几种GOP模式差距较小此外,一般来说GOP越长,质量越好。

码率上升带来的视频质量提高较明显,当码率提升,质量提升效果也慢慢减少。

此外,注意全I帧中400kbps以下没有变化,可能是因为400kbps-800kbps触及了码流的下界。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43175007/article/details/107824897

智能推荐

vue3背景下,el-input嵌套在弹出框中,自动聚焦“失效”?如何实现自动聚焦_vue3 el-input 自动聚焦autofocus无效-程序员宅基地

文章浏览阅读436次,点赞15次,收藏2次。原因或许是,使用autofocus时,确实聚焦了!但是当我们又点击 显示弹出框的按钮时,input又失焦了,所以当我们看到input框时,没有自动聚焦。_vue3 el-input 自动聚焦autofocus无效

linux网络服务配置说课,《说课稿LINUX》PPT课件.ppt-程序员宅基地

文章浏览阅读222次。《《说课稿LINUX》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《说课稿LINUX》PPT课件.ppt(16页珍藏版)》请在装配图网上搜索。1、LINUX 基础应用与配置管理 桂林山水职业学院计算机系 朱笑雷 主要内容 课程定位 1 课程内容设置 2 教学方法与手段 3 教材建设 4 教学团度 5 主要内容 实践条件 6 课程考核 7 教学效果 8 课程特色 9 建设思路 10 一、课..._linux说课课件

在SpringBoot中启动时关于连接数据库失败的问题_springboot启动时数据库连接失败 不关闭-程序员宅基地

文章浏览阅读2.2k次。#在SpringBoot中启动时关于连接数据库失败的问题对照了application.yml,发现配置文件貌似没什么问题,但是在查找信息之后,发现问题正是出现在application.yml中问题出于datasource下的data-username和data-password只要将data-username和data-password改为username和password即可..._springboot启动时数据库连接失败 不关闭

antd-pro(V5)动态菜单_antdpro的菜单-程序员宅基地

文章浏览阅读4.6k次。一般情况下登录系统后菜单是由后端返回的,不是前端写死的。antd-pro也支持,修改的路径在app.tsx在 layout 里加一个menuDataRender字段先给一个() =>[]可以看到左侧菜单没了,说明配置生效了,接下来就可以围绕这个配置做文章了,我们先定义一个 menuDataRender方法。根据登录缓存到本地的数据做下处理,判断菜单里要展示哪些内容(比如替换字段,隐藏不显示的菜单,隐藏按钮等),处理好了后返回一个数组结构即可。示例代码如下export const layout: _antdpro的菜单

Linux安装使用jprofiler6分析服务器应用状态-程序员宅基地

文章浏览阅读77次。为什么80%的码农都做不了架构师?>>> ..._jprofiler6 key

苏小红C语言第四版课后习题练习7.7最大公约数三种计算方式_c语言程序设计第四版课后题答案苏小红第七章-程序员宅基地

文章浏览阅读170次。(可以看出递归算法更加侧重于计算的技巧,并且计算机计算的次数也相对更少);_c语言程序设计第四版课后题答案苏小红第七章

随便推点

视频格式转换器榜单:10 款最值得拥有的高清视频转换器_奇客视频转换-程序员宅基地

文章浏览阅读560次。如果您想在计算机或任何其他设备上播放高质量的视频,高清视频转换器可以帮助确保您的视频与您的操作系统和硬件兼容。您还可以使用高清转换器更改视频的分辨率,无论您是想提高质量还是降低分辨率以生成更小的文件。在下表中,我们描述了用于转换高清视频的最流行和可用的桌面程序和在线服务。它们各有优缺点,因此请根据您的需要进行选择。_奇客视频转换

Unity血条效果,图片动画_游戏血条动图-程序员宅基地

文章浏览阅读1.9k次。欢迎来到unity学习、unity培训、unity企业培训教育专区,这里有很多U3D资源、U3D培训视频,我们致力于打造业内unity3d培训、学习第一品牌。今天开始做我们的游戏了,组长给分配了任务,我负责做剧情动画,人物血条和种植植物。 一、剧情动画 动画是以多个图片的形式展现的,图片是自己制作的。 private GUITextu_游戏血条动图

环境变量的加载顺序、环境变量集合_环境变量的顺序-程序员宅基地

文章浏览阅读1k次。*******字符编码ASCII,GB2312,GBK,Unicode,UTF-8比较参考:https://blog.csdn.net/softwarenb/article/details/51994943**环境变量的加载顺序:Mac系统的环境变量,加载顺序为:a. /etc/profileb. /etc/pathsc. ~/.bash_profiled. ~/..._环境变量的顺序

科学家发现让人类幸福感飙升的密码!给大脑植入这个算法 | 精选-程序员宅基地

文章浏览阅读316次。▼大型年度AI人物评选——2017中国AI英雄风云榜已于12月4日在乌镇张榜,12月18日在北京国贸三期举行颁奖典礼。榜单评选出年度技术创新人物TOP 10;商业创新人物TOP 10,获取完整榜单请关注网易智能公众号(ID:smartman163),回复关键词“评奖”。本文系网易智能工作室出品聚焦AI,读懂下一个大时代【网易智能讯12月10日消息】不只有你会_人类大脑植入代码

正则表达式匹配中括号内的内容_正则<>里内容-程序员宅基地

文章浏览阅读3.6k次。几经研究, 终于实现了。time[2020-06-04 11:43:36](?<=\[)(.*)(?=])(pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。 (?:pattern) 匹配 pattern 但不获取匹配结..._正则<>里内容

C++程序启动时报“R6030 CRT not initialized”错误_r6030 -crt not initialized-程序员宅基地

文章浏览阅读1.4w次,点赞11次,收藏12次。SPY++工具注入到C++程序的进程中,导致程序启动时报“R6030 CRT not initialized”错误,本文将讲解该问题的排查过程。_r6030 -crt not initialized