H.264编码实验--JM18.6H264Visa
目录
- 任务一、将两个.264文件进行解码,得到相应的YUV文件
- 1.1 Decoder Syntax
- 1.2 解码
- 任务二:将上述两个视频序列编码为.264文件
- 2.1 Encoder Syntax
- 2.2 编码
- 2.2.1 固定码率,以不同的GOP长度及形状编码
- 2.2.2 相同的GOP长度及形状,不同的码率
- 2.2.3 实验结果
- 任务三:用码流分析软件检查所生成的码流中各种编码模式和运动矢量等信息
- 3.1 编码模式分析
- 3.2 运动矢量分析
- 任务四:用播放器观看所生成码流的质量
- 4.1 固定码率不同GOP
- 4.2 相同GOP不同码率
- 任务五:生成率失真曲线
任务一、将两个.264文件进行解码,得到相应的YUV文件
1.1 Decoder Syntax
参考JM使用手册,解码语法如下:
ldecod [-s] [-h] {[defdec.cfg] | {[-p pocScale][-i bitstream.264]…[-o output.yuv][-r reference.yuv] [-uv]}}
参数 | 含义 |
---|---|
-h | 打印参数使用方法 |
[defdec.cfg] | 可选解码器配置文件,其中包含所有解码器信息 |
-s | 无声解码 |
-i | 设置解码文件<bitstream.264> 。默认值设定为test.264 |
-o | 设置重建文件 <output.yuv>。默认值设定为test_dec.yuv |
-r | 用于PSNR计算的参考序列文件被设置为<reference.yuv>。默认为test_rec.yuv |
-p | 设置Poc量表,默认值为2 |
-uv | 输出灰度分量以,允许在420 YUV播放器上观看输出 |
Examples:
ldecod.exe
ldecod.exe -h
ldecod.exe default.cfg
ldecod.exe –s –i bitstream.264
ldecod.exe –i bitstream.264 –o output.yuv –r reference.yuv
ldecod.exe –i bitstream420.264 -uv
1.2 解码
将JM18.6下的ldecod.exe、decoder.cfg与要处理的.264文件放在同一目录下,利用cmd指令指定解码文件与解码得到的yuv文件名,完成解码;
ldecod.exe -i a.264 -o a.yuv
或者在文件decoder.cfg中对以下参数作出修改:
InputFile = "a.264" # H.264/AVC coded bitstreamOutputFile = "a.yuv" # Output file, YUV/RGB
再使用cmd指令完成解码。
ldecod.exe -d decoder.cfg
任务二:将上述两个视频序列编码为.264文件
2.1 Encoder Syntax
参考JM使用手册,编码语法如下:
lencod [-h] [-d defenc.cfg] {[-f curenc1.cfg]…[-f curencN.cfg]}
{[-p EncParam1=EncValue1]…[-p EncParamM=EncValueM]}
参数 | 含义 |
---|---|
-h | 打印参数使用方法 |
-d | 使用<defenc.cfg>作为参数初始化的默认文件。否则文件默认为本地目录中的“coder.cfg“ |
-f | 读取<curencM.cfg>以重置选定的编码器参数。 可以使用设置不同参数的多个文件 |
-p | 将参数设置为。 的条目不区分大小写 |
Examples:
lencod.exe
lencod.exe -h
lencod.exe -d default.cfg
lencod.exe -f curenc1.cfg
lencod.exe -f curenc1.cfg –p InputFile=“e:\data\container_qcif_30.yuv”\ -p SourceWidth=176 -p SourceHeight=144
lencod.exe -f curenc1.cfg -p FramesToBeEncoded=30 \ -p QPFirstFrame=28 -p QPRemainingFrame=28 -p QPBPicture=30
2.2 编码
2.2.1 固定码率,以不同的GOP长度及形状编码
GOP=15,2B帧;GOP=12,2B帧,GOP=9,2B帧
GOP=4,1B帧;GOP=12,无B帧;GOP=1,全I帧
将JM18.6下的lencod.exe、encoder.cfg与刚生成的yuv文件放在同一目录下。
以编码规格GOP15/2B,1000kbps为例,对文件encoder.cfg中的如下参数进行修改:
InputFile = "a.yuv" # Input sequence
FramesToBeEncoded = 30 # Number of frames to be coded
SourceWidth = 560 # Source frame width
SourceHeight = 314 # Source frame height
OutputWidth = 560 # Output frame width
OutputHeight = 314 # Output frame height
ReconFile = "a11_rec.yuv" # Reconstruction YUV file
OutputFile = "a11.264" # Bitstream
IntraPeriod = 15 # Period of I-pictures (0=only first)
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)
RateControlEnable = 1 # 0 Disable, 1 Enable
Bitrate = 1000000 # Bitrate(bps)
RCUpdateMode = 0 # 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
之后使用以下cmd指令完成编码。
lencod.exe -f encoder.cfg
现对encoder.cfg中的部分重要参数作出解释:
参数 | 解释 |
---|---|
FramesToBeEncoded | 指定要编码的帧数 |
IntraPeriod | 编码序列中I编码帧(非IDR)的最大周期 |
NumberBFrames | 使用B片编码的帧数。如果HierarchicalCoding设为3,则参数被覆盖(所以这里需要把HierarchicalCoding改为0) |
RateControlEnable | 启用简单的速率控制支持。默认值为0(禁用) |
RCUpdateMode | 指定速率控制算法。全I编码时设置为1,其余情况设置为0 |
Bitrate | 码率/bps |
Example: Encode a sequence at 100kbps, with an initial QP of 32,while performing adaptation at the frame level.
lencod.exe –p RateControlEnable=1 –p Bitrate=100000 \ –p InitialQP=32 –p BasicUnit=99
2.2.2 相同的GOP长度及形状,不同的码率
1000kb/s, 800kb/s,400kb/s
因为要生成多种编码规格的多个文件,每次都打开encoder.cfg修改参数会很麻烦,所以后续可以直接使用如下cmd指令完成编码。-p后设置的参数可以覆盖默认参考文件encoder.cfg中的相应参数。
lencod.exe -d encoder.cfg -p ReconFile= “…” -p OutputFile= “…” -p IntraPeriod=… -p NumberBFrames=… -p Bitrate=…
2.2.3 实验结果
以下为编码规格GOP15/2B,1000kbps的输出结果,可以看到Y-PSNR的值为39.553dB,实际码率为976312bps。
任务三:用码流分析软件检查所生成的码流中各种编码模式和运动矢量等信息
3.1 编码模式分析
H.264采用帧内预测编码和帧间预测编码结合的形式。
就帧内预测编码而言,H.264并不直接对图像块处理,而是根据邻近块的值来预测当前宏块的值,再对预测值和原始值的差值进行变换、量化和编码。每预测一个宏块,则重建一个宏块,重建值=预测值+残差,最新重建的宏块作为下一宏块预测的参考块。
使用H.264 visa打开码流文件,打开MB Rec,分析某一宏块:
Final是最终的重建值,Residual指残差,Predicted是预测值,观察发现:
- Pre-LoopFilter=Predicted+Residual
- Final与Pre-LoopFilter完全一样或有像素差2以内的细微差别
查阅资料可知,H.264解码器在解码后得到的图像一般会出现块效应,产生块效应的原因主要来自:
- DCT变换带来的量化误差
- 运动补偿
为了减少块效带来的影响,需要添加LoopFilter(环路滤波)调整相邻块边缘上的像素值以减轻视觉上的不连续感。
这里Pre-LoopFilter用来在编码时产生参考,也就是说,Pre-LoopFilter经过LoopFilter产生最终的重建值Final,Final可作为下一步预测的参考。
之后打开MB Blocks逐帧分析。视频流的第一帧一定是I帧,具体宏块类型(MB Type)有I_4x4,I_8x8,I_16x16。即I帧内只含有其中只含有I型宏块,根据画面内容变化从剧烈到平坦依次选用4x4,8x8,16x16的编码模式。
视频流中的P帧,含有I型宏块(粉色),和P型宏块(绿色),相较I帧,其编码方式不再局限于4x4,8x8,16x16,而是更加灵活。
这是因为P帧是前向预测编码帧,需要参考它之前的I帧或P帧进行编码,为了提高帧间预测编码时的编码效率,采用树状结构运动补偿技术(Tree Structured Motion Compensation)。即根据画面内容平坦程度,用不同形状和大小的块灵活划分区域,进行运动搜索。
视频流中的B帧,含有I型宏块(粉色),和B型宏块(蓝色)。B帧是双向预测编码帧,参考它前后的I帧或P帧编码,同样使用不同形状和大小的块进行运动补偿。
3.2 运动矢量分析
打开MB Motion Vectors分析运动矢量,这里运动矢量分为由后向预测得到的红色矢量和由前向预测得到的绿色矢量。
I帧中不含运动矢量,也就是说,I帧是帧内压缩编码帧,它不参考前向或后向的任何帧。
P帧中只含有绿色的运动矢量,这就验证了P帧是由前向预测得到的。同时运动矢量描述了物体运动的走向。
B帧中含有两种颜色的运动矢量,这就验证了B帧是通过双向预测得到的
任务四:用播放器观看所生成码流的质量
4.1 固定码率不同GOP
依序按照以下规格进行编码,码率固定为1000kbps
1.GOP=15,2B帧;2.GOP=12,2B帧,3.GOP=9,2B帧
4.GOP=4,1B帧;5.GOP=12,无B帧;6.GOP=1,全I帧
用H264Visa观看生成的码流,截取同一帧,按以上顺序排列:
对比图1、2、3可以发现:B帧数相同,GOP越长,图像质量越好
对比图2、5可以发现:相同GOP下,B帧数越少图像质量越好
全I帧编码下图像质量最差
4.2 相同GOP不同码率
编码规格为GOP15/2B,从左至右码率依次为1000kbps、800kbps、400kbps。
这里图像均较为模糊,肉眼不易区分其清晰度。
视频大小如下:
理论上讲,相同GOP下,视频码率越高,即代表视频容量越大,质量越好,越清晰。
任务五:生成率失真曲线
PSNR是"Peak Signal to Noise Ratio"的缩写,即峰值信噪比,是一种评价图像的客观标准。
记录码流的Y-PSNR/dB(实际生成的码率与理想值有少量差距,这里忽略不计):
观察可知,相同GOP结构下,码率越高,PSNR越大,即图像质量越好。
相同码率下,GOP越长,B帧数目越小,PSNR越大。
全I帧情况下的PSNR最小,图像质量最差。
这样的规律也与主观观察到的码流质量情况一致。
H.264编码实验--JM18.6H264Visa相关推荐
- 实验七 H.264编码实验
一.实验要求 自行选择或老师给的两个264文件进行解码,得到相应的YUV文件 将上述两个视频序列编码为.264文件 1.固定码率,以不同的GOP长度及形状编码 ■GOP=15,2B帧; GOP=12, ...
- H.264编码相关概念
概念目录 一.H.264 格式特征 1.H.264 的层次 2.H.264档次 3.H.264的采样格式 4.H.264的编解码原理 二.H.264 的编解码框架 1.编码器结构 2.解码器结构 三. ...
- H.264编码系统几个比较重要的算法
H.264编码系统比较复杂,这里是它的几个比较重要的算法: 1. Configure()函数,用于解析命令行参数,读取配置文件,其中,ac表示命令行参数数量,av表示命令行参数.void Config ...
- C++实现RTMP协议发送H.264编码及AAC编码的音视频
C++实现RTMP协议发送H.264编码及AAC编码的音视频 RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司 ...
- 开发直播APP软件一定要了解的H.264编码,即时通讯中的战斗机
开发直播APP软件一定会涉及即时通讯,即时通讯系统在直播系统中的主要作用是实现观众与主播.观众与观众之间的文字.音频.视频互动,现在比较火的主播连麦PK等功能的背后都显现着即时通讯的影子,而在即时通讯 ...
- RTMP协议发送H.264编码及AAC编码的音视频,实现摄像头直播
RTMP协议发送H.264编码及AAC编码的音视频,实现摄像头直播 摘要: RTMP协议发送H.264编码及AAC编码的音视频,实现摄像头直播 RTMP(Real Time Messaging Pro ...
- 视频基础知识:浅谈视频会议中H.264编码标准的技术发展
浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...
- H.265编码和H.264编码的区别
目前很多摄像机采用了H.265的编码标准,H.264编码的摄像机逐渐减少,为什么H.265会流行?H.264和H.265有何不同? 一.什么是H.265 H.265是ITU-TVCEG继H.264之后 ...
- 开发那些事儿:在Flv.js前端播放器中解析并绘制H.264编码中的SEI信息
流媒体中的SEI是指补充增强信息(Supplemental Enhancement Information),它提供了向视频码流中加入信息的办法,是H.264/H.265视频压缩标准的特性之一.SEI ...
- 利用FFmpeg编码器将JPG图片进行H.264编码原理
利用FFmpeg编码器将JPG图片进行H.264编码原理 文章目录 利用FFmpeg编码器将JPG图片进行H.264编码原理 整体的编码流程 将JPG或BMP编码为YUV 利用FFmpeg将YUV格式 ...
最新文章
- MySQL基本语句与数据类型
- 用python的turtle画圆-(python海龟绘图怎么增加每次画圆的半径)
- ie 报错 vuex requires a Promise polyfill in this browser
- Linux watch命令详解
- shell中的>/dev/null 2>1(转载)
- Topcoder SRM 628 DIV 2
- 我也属于80这个年代
- Bounce(弹走绵羊)lct裸题
- 20175204 张湲祯 2018-2019-2《Java程序设计》第三周学习总结
- Effective Java学习笔记之第6条 消除过期的引用对象
- php魔法函数用途,PHP中的Magic Methods (魔术函数)
- struts2文件下载及文件名中文问题
- idea使用时遇到的一个小问题
- ACM算法模板 · 一些常用的算法模板-模板合集(打比赛专用)
- protel中单位换算!mil=?mm!走线的粗细
- python求绝对值_python绝对值怎么计算
- jser必看的破解javascript各种加密的反向思维方法 转自脚本之家
- 台式计算机有乱码如何解决,电脑乱码怎么办,开机乱码解决方法
- LOJ 6131 Fiend - 行列式 - 可并堆 - 贪心
- Spark Transformation算子->subtract