H.264 中的相关问题

帧内解码时,在解码端,首先通过当前宏块左边、上边已经解码完成的宏块使用当前宏块的预测模式(预测模式计算过程请参见我的论文《H.264数字视频差错控制技术的研究》,在群FTP“本群原创资料”目录中)得到当前宏块的像素预测值。然后通过对码流进行解码得到当前宏块的像素残差。最后将残差和预测值加在一起就得到重构的像素值。如果当前宏块的左边或者右边的宏块不存在(即当前宏块为图像边界上的宏块),那么其预测值全部为128

帧间解码时,在解码端,首先对码流进行解码得到当前宏块的参考帧,然后通过当前宏块周围宏块计算运动矢量预测值(具体方法见毕厚杰书99页,标准中也有,但我一时不知道在什么地方了)。然后通过对码流进行解码得到当前宏块的运动矢量残差。将运动矢量残差与运动矢量预测值相加得到实际的运动矢量。然后通过对码流进行解码得到当前宏块的像素残差(如果当前宏块有像素残差的话)。然后通过参考帧与上面计算得到的MV计算出当前宏块的像素预测值。再将像素预测值与像素残差相加就得到当前宏块的重构。

说明:

1、以上过程为 JM86 的解码过程。并不一定所有代码都按照这个流程;    

2、上面说的运动矢量预测值的计算过程实际是以4*4块为单位,参考帧也是针对4*4块做的。这里写成宏块主要是方便大家理解。

RDO

Rate-Distortion Optimization 是视频编码中最优选择mode的一种方法。比如h.264里好多mode 8x8 16x16 I4x4 I16 在给定的条件下,哪个是最好的?

Distortion 是指选用candidate mode产生的失真,rate是用这个mode需要的rate.他们换算成RDCost = Distortion + lamda * rate. 两个mode谁的rdcost 低就选谁,其中的数学原理是条件极值转非条件极值。

JM 里用的RDO是比较经典的方法。最早是Gary J.Sullivan做的 参见 IEEE Signal Processing Magazine 1998 Nov.  "Rate-Distortion Optimization for video compression" rdo的经典。 h264里的rdo还可参考CSVT H.264 special issue.

H.264里面当前帧属于哪个slice的决定形式是多种多样的,对于JM中的码流中,一般一帧图象就认为是一个slice,那么如果当前帧是一个I帧,那么它就属于一个I slice.这时整个frame的为一个slice.但是具体我们用什么样的方式来进行slice type的决策呢,这也是一个问题。我们看一下T264里面是如何处理这个问题的。

T264,如果我们设定了,USE_SCENEDETECT的话,当前的slice种类是由当前帧的帧号与设定的idrframe,iframebframe相关的,如果frame_no%idrframe==0的话,那么说明当前帧是属于一个IDR slice的,如果frame_no%iframe==0的话,该帧属于一个I slice.如果上面的情况不满足那么是属于P sliceB slice.由于码流中只有如下几种类型:0) I P P P ..... I P P P  1) I B P B P.....B P B P   2) I B B P B B P.....B B P I B B P,所以如果frame_no%(bframe+1)==0的话,就属于P slice,如果不是的话属于B slice.

如果没有使用USE_SCENEDETECT的话,是用MeAnalysis来决定当前属于什么slice的。这种形式是动态式地决定是不是要加入一个I slice。决定流程如下:如果我们达到了我们在config里面设定的iframe interval的话,当前帧就是一个I slice.我们设定一个INTRA_THRESHOLD,对帧中的每一个宏块进行预测,来计算sad.这个过程因为计算量比较大,所以使用了简化算法,首先用前一帧的mv做预测值,计算sad,如果这个值大于我们设定的SEARCH_THRESHOLD的话,说明上一帧的mv已不适合做当前帧的预测,我们会使用一个简化的diamond search来简单地找一下当前宏块的mv,进行sad计算。整个帧的sad计算结束之后,我们与INTRA_THRESHOLD进行比较,如果sad大的话,这一帧为I slice中的一帧,如果小的话,我们认为它是一个PB帧。对于当前帧是P还是B帧还是用上面的方法进行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wenzhixin bootstrap-table 点击table单元格改变颜色

bootstrap-table用于展示数据非常方便,也需要满足一些个性化需求。比如点击窗格(td)标记下颜色,用于目测 代码如下,转载请注明 $("table").on(click-row.bs.table, function (e, row, $el) {//el[0] is tr …

tornado学习笔记day01-高并发性能web框架

tornado的安装 这里我使用的是虚拟环境中的pip安装,配合清华大学镜像源安装的 pip install tornado -i https://pypi.tuna.tsinghua.edu.cn/simple我的第一个tornado程序 import tornado.web import tornado.ioloopclass IndexHandler(tornado.web.RequestHandler):主页处理…

python99乘法表while翻译_Python学习之while练习--九九乘法表

效果如下&#xff1a;实现代码;m 1n 1while(m<10):while(n<m):print(n,"*",m,"",m*n,end \t)n 1print(\n)n 1m 1解析&#xff1a;这是一个很简单的while嵌套程序&#xff0c;首先分析九九乘法表是从上往下逐行增加&#xff0c;且第一列乘积为1…

ASP.NET Core 2加入了Razor页面特性

最近发布的ASP.NET Core 2.0&#xff0c;连同新发布的.NET Core 2和Entity Framework Core 2.0y&#xff0c;一并构成了.NET Core 2.0生态中的三元组。此发布给出了多个新特性和改进&#xff0c;其中包括通用性能的改进、Razor页面、新的开发模板以及更好的Azure Diagnostics支…

matlab 矩阵拼接

E[a&#xff0c;b]%水平方向上的拼接 E[a &#xff1b;b] %垂直方向上的拼接 转载于:https://www.cnblogs.com/hsy1941/p/7124083.html

JM8.5中的7种宏块模式问题 - zhoujunming的专栏 - CSDN博客

JM8.5中的7种宏块模式问题 收藏 Outline: 1、 CFG文件中有关可变尺寸宏块模式的相关选项2、 7种宏块模式对应的数值常量3、 7种宏块模式被分成宏块和亚宏块4、 如何对宏块和亚宏块的运动估计&#xff0c;采用一个共同的函数来处理5、 遗留问题1、CFG文件中有关可变尺寸宏块…

tornado学习笔记day02-进阶与提升

整理基础工程 请看第一天的配置文件目录,搭建了一个框架的基础目录 Application settings debug 作用 可以设置tornado是否工作在调试模式下面,默认为false,即工作在生产模式下 true的特性: 自动重启: tornado程序会监控源代码文件,会自动重启服务器,减少我们手动重启…

python123测验2答案八边形_Python试卷

3、写一个函数&#xff0c;计算一个给定的日期是该年的第几天。def getday(self,yNone,mNone,dNone):date datetime(y,m,d)days date.strftime(%j)return days4、写一个函数&#xff0c;给定N&#xff0c;返回斐波那契数列第N项。def getn_vlaue(self,n):if n<2:return 1e…

java实体类如果不重写toString方法,会如何?

先认识一下Object Object 类的 toString 方法 返回一个字符串&#xff0c;该字符串由类名&#xff08;对象是该类的一个实例&#xff09;、at 标记符“”和此对象哈希码的无符号十六进制表示组成。换句话说&#xff0c;该方法返回一个字符串&#xff0c;它的值等于&#xff1a;…

H.264 中很有用的一些概念

Q:PSNR 峰值信噪比 是根据它来取qp是不是&#xff1f; A:不是 和QP没有直接关系但是QP的选择会影响到PSNR Q: 如果不用率失真最优化&#xff0c;为什么选择SATD&#xff0b;deltar&#xff08;mv&#xff0c;mode&#xff09;作为模式选择的依据&#xff1f;为什么运动估…

tornado学习笔记day03-响应输出

write: 作用: 将chunk中的数据写到输出缓冲区 利用write方法写json数据 我们自己手动序列化json的那种方式Content-Type 的属性值为text-html而我们采用write自动序列化方式,我们的content-type 属性为application/json set_default_headers(): 作用: 在进入HTTP响应方法…

Machine Learning——octave矩阵操作(2)——DAY3

矩阵的数学操作&#xff1a; Assumed: a为一个矩阵&#xff0c;m是一个向量 Log(a)——求每一个元素的对数 Exp(a)——以e为底的指数 1./a——求每个元素的导师 [a,b]max(m)——m是一个向量&#xff0c;a为m当中最大的元素&#xff0c;b为a在m中的排列序号&#xff08;已按从小…

python 多进程并发_python并发编程之多进程

一 multiprocessing模块介绍python中的多线程无法利用多核优势&#xff0c;如果想要充分地使用多核CPU的资源(os.cpu_count()查看)&#xff0c;在python中大部分情况需要使用多进程。Python提供了multiprocessing。multiprocessing模块用来开启子进程&#xff0c;并在子进程中执…

tornado学习笔记day04-执行顺序

响应输出 -> write 原型 self.write()函数 源码中是这样定义的 def write(self, chunk: Union[str, bytes, dict]) -> None:作用 将chunk数据写到缓冲区 刷新缓冲区的四种方式 程序中断手动刷新缓冲区满了遇到\n 当你写了一个print之后,不是直接就显示在黑屏中断…

字符串中文判断

2019独角兽企业重金招聘Python工程师标准>>> 1、判断字符串是否全是中文或含有中文 <?php header(Content-type:text/html; charsetutf-8); $str 你好; if(preg_match(/^[\x{4e00}-\x{9fa5}]$/u, $str)>0){ echo 全是中文; …

angular使用动态组件后属性值_Angular动态加载组件

引言有时候需要根据URL来渲染不同组件&#xff0c;我所指的是在同一个URL地址中根据参数的变化显示不同的组件&#xff1b;这是利用Angular动态加载组件完成的&#xff0c;同时也会设法让这部分动态组件也支持AOT。动态加载组件下面以一个Step组件为示例&#xff0c;完成一个3个…

分治2--取余运算

分治2--取余运算 一、心得 二、题目和分析 题目描述 输入b&#xff0c;p&#xff0c;k的值&#xff0c;求bp mod k的值。其中b&#xff0c;p&#xff0c;k*k为长整型数。输入 三个整数&#xff0c;分别为b&#xff0c;p&#xff0c;k的值输出 bp mod k样例输入 2 10 9样例输出 …

-mysql-锁机制分为表级锁和行级锁

2019独角兽企业重金招聘Python工程师标准>>> 声明&#xff1a;本栏目所使用的素材都是凯哥学堂VIP学员所写&#xff0c;学员有权匿名&#xff0c;对文章有最终解释权&#xff1b;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 mysql锁机制分为表级锁和行级锁 …

tornado学习笔记day05-访问数据库

模板## 配置模板路径 这个在之前我们已经配置好了,可以参考前面的文章 settings {# 就像upfile就没有,你写了也白扯template_path: os.path.join(BASE_DIR, "templates"), }渲染并返回给客户端 使用render()方法 class HomeIndexHandler(RequestHandler):def ge…

pythonelectron桌面开发案例_使用Electron开发基于Node.js的桌面应用

最近小编在查看分享资料时&#xff0c;发现一个可以开发跨平台桌面应用的框架——NW.js(原名&#xff1a;node-webkit)。正当小编兴致勃勃的研究NW.js的时候&#xff0c;最基础的安装环节出了问题。无论用npm还是cnpm都无法完整下载所依赖的包(具体原因待考察)。鉴于此&#xf…