Atitit 视频编码与动画原理attilax总结
Atitit 视频编码与动画原理attilax总结
要彻底理解视频编码原理,看书都是虚的,需要实际动手,实现一个简单的视频编码器:
知识准备:基本图像处理知识,信号的时域和频域问题,熟练掌握傅立叶正反变换,一维、二维傅立叶变换,以及其变种,dct变换,快速dct变换。
1.1. 第一步:实现有损图像压缩和解压
参考 JPEG原理,将RGB->YUV,然后Y/U/V看成三张不同的图片,将其中一张图片分为 8×8的block进行 dct变换(可以直接进行二维dct变换,或者按一定顺序将8×8的二维数组整理成一个64字节的一维数组),还是得到一个8×8的整数频率数据。于是表示图像大轮廓的低频信号(人眼敏感的信号)集中在 8×8的左上角;表示图像细节的高频信号集中在右下角。
1.2. 接着将其量化,所谓量化,就是信号采样的步长,
8×8的整数频率数据块,每个数据都要除以对应位置的步长,左上角相对重要的低频信号步长是1,也就是说0-255,是多少就是多少。而右下角是不太重要的高频信号,比如步长取10,那么这些位置的数据都要/10,实际解码的时候再将他们*10恢复出来,这样经过编码的时候/10和解码的时候*10,那么步长为10的信号1, 13, 25, 37就会变成规矩的:0, 10, 20, 30, 对小于步长10的部分我们直接丢弃了,因为高频不太重要。
经过量化以后,8×8的数据块左上角的数据由于步长小,都是比较离散的,而靠近右下角的高频数据,都比较统一,或者是一串0,因此图像大量的细节被我们丢弃了,这时候,我们用无损压缩方式,比如lzma2算法(jpeg是rle + huffman)将这64个byte压缩起来,由于后面高频数据步长大,做了除法以后,这些值都比较小,而且比较靠近,甚至右下部分都是一串0,十分便于压缩。
JPEG图像有个问题就是低码率时 block边界比较严重,现代图片压缩技术往往要配合一些de-block算法,比如最简单的就是边界部分几个像素点和周围插值模糊一下。
做到这里我们实现了一个同 jpeg类似的静态图片有损压缩算法。在视频里面用来保存I帧数据。
1.3. 第二步:实现宏块误差计算
视频由连续的若干图像帧组成,分为 I帧,P帧,所谓I帧,就是不依赖就可以独立解码的视频图像帧,而P帧则需要依赖前面已解码的视频帧,配合一定数据才能生成出来。所以视频中I帧往往都比较大,而P帧比较小
1.4. 那么所谓运动预测编码,其实就是P帧的生成过程
按照第三步实现的逻辑,P2’其实已经很像P2了,只是有些误差,我们将这些误差保存成了图片D2,所以图片D2中,信息量其实已经很小了,都是些细节修善,比起直接保存一张完整图片熵要低很多的。所以我们将 D2用类似第一步提到的有损图片压缩方法进行编码,得到最终的P帧数据:
C++
|
1 |
Encode(P2) = Lzma2(block_positions) + 有损图像编码(D2) |
具体在操作的时候,D2的图像块可以用16×16进行有损编码,因为前面的运动预测数据是按16×16的宏块搜索的,而不用象I帧那样精确的用8×8表示,同时保存误差图时,量化的精度可以更粗一些用不着象I帧那么精确,可以理解成用质量更低的JPEG编码,按照16×16的块进行编码,加上误差图D2本来信息量就不高,这样的保存方式能够节省不少空间。
1.5. 第五步:实现GOP生成
通过前面的代码,我们实现了I帧编码和P帧编码,P帧是参考P1对P2进行编码,而所谓B帧,就是参考 P1和 P3对P2进行编码,当然间隔不一定是1,比如可以是参考P1和P5对P2进行编码,前提条件是P5可以依赖P1及以前的数据进行解码。
不过对于一个完整的简版视频编码器,I帧和P帧编码已经够了,市面上任然有很多面向低延迟的商用编码器是直接干掉B帧的,因为做实时传输时收到B帧没法播放,之后再往后好几帧收到下一个I或者P帧时,先前收到的B帧才能被解码出来,造成不少的延迟。
而所谓的 GOP (Group of picture) 就是由一系列类似 I, P, B, B, P, B, B, P, B, B P 组成的一个可以完整被解码出来的图像组,而所谓视频文件,就是一个接一个的GOP,每个GOP由一个I帧开头,然后接下来一组连续的P 或者 B构成,播放时只有完整收到下一个GOP的I帧才能开始播放。
第六步:容器组装
第七部:优化改进
这时候你已经大概学习并掌握了视频编码的基础原理了,接下来大量的优化改进的坑等着你去填呢。优化有两大方向,编码效率优化和编码性能优化:前者追求同质量(同信噪比)下更低的码率,后者追求同样质量和码率的情况下,更快的编码速度。
视频编码原理简介 - 文章 - 伯乐在线.html
作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 )
汉字名:艾提拉(艾龙), EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
Atiend
Atitit 视频编码与动画原理attilax总结的更多相关文章
- Atitit wsdl的原理attilax总结
Atitit wsdl的原理attilax总结 1.1. 在 W3C 的 WSDL 发展史1 1.2. 获取wsdl,可能需要url后面加wsdl,也可能直接url1 1.3. Wsdl的作用2 1. ...
- Atitit.Base64编码原理与实现设计
Atitit.Base64编码原理与实现设计 1. Base64编码1 1.1. 为什么要用自己的base64编码方案1 2. Base64编码由来1 3. Base64编码原理1 3.1. 具体来说 ...
- Atitit 边缘检测原理attilax总结
Atitit 边缘检测原理attilax总结 1. 边缘检测的概念1 1.1. 边缘检测的用途1 2. 边缘检测方法分类1 3. 边缘检测的基本方法2 3.1. Roberts边缘检测算子2 3.2. ...
- Atitit.数据库存储引擎的原理与attilax 总结
Atitit.数据库存储引擎的原理与attilax 总结 1. 存储引擎是什么1 2. 其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储2 3. 表的存储有三个文件:结构+数据+索引2 4 ...
- Atitit 马尔可夫过程(Markov process) hmm隐马尔科夫。 马尔可夫链,的原理attilax总结
Atitit 马尔可夫过程(Markov process) hmm隐马尔科夫. 马尔可夫链,的原理attilax总结 1. 马尔可夫过程1 1.1. 马尔科夫的应用 生成一篇"看起来像文章的 ...
- Atitit.java图片图像处理attilax总结 BufferedImage extends java.awt.Image获取图像像素点image.getRGB(i, lineIndex); 图片剪辑/AtiPlatf_cms/src/com/attilax/img/imgx.javacutImage图片处理titit 判断判断一张图片是否包含另一张小图片 atitit 图片去噪算法的原理与
Atitit.java图片图像处理attilax总结 BufferedImage extends java.awt.Image 获取图像像素点 image.getRGB(i, lineIndex); ...
- Atitit.软件与编程语言中的锁机制原理attilax总结
Atitit.软件与编程语言中的锁机制原理attilax总结 1. 用途 (Db,业务数据加锁,并发操作加锁.1 2. 锁得类型 排它锁 "互斥锁 共享锁 乐观锁与悲观锁1 2.1. 自旋锁 ...
- Atitit.计算机图形图像图片处理原理与概论attilax总结
Atitit.计算机图形图像图片处理原理与概论attilax总结 计算机图形1 图像处理.分析与机器视觉(第3版)1 数字图像处理(第六版)2 图像处理基础(第2版)2 发展沿革 1963年,伊凡·苏 ...
- Atitit web remote远程调试的原理attilax总结
Atitit web remote远程调试的原理attilax总结 Jvm是vm打开一个debug port,然后ide先连接..然后执行url,就会vm会与ide沟通.. Php的xdebug po ...
随机推荐
- UIAppearance
1> 只要遵守了UIAppearance协议,还要实现这个方法才能调用appearance相关方法 2> 只有被UI_APPEARANCE_SELECTOR宏修饰的属性,才能设置 // 获 ...
- lua 快速排序
function partion(arr, left, right) local tmp = arr[left] while left < right do while left < ri ...
- 进阶——scrapy登录豆瓣解决cookie传递问题并爬取用户参加过的同城活动©seven_clear
最近在用scrapy重写以前的爬虫,由于豆瓣的某些信息要登录后才有权限查看,故要实现登录功能.豆瓣登录偶尔需要输入验证码,这个在以前写的爬虫里解决了验证码的问题,所以只要搞清楚scrapy怎么提交表单 ...
- 在centos上配置IP
当我们安装好系统后,最先做的应该就是配置IP了,因为无论是要下载工具软件.还是远程链接,网络必不可少,所以我们要先来配置IP! 一.查看IP 如何在centos上查看IP呢,使用 ifconfig 命 ...
- 分析Linux内核创建一个新进程的过程
一.原理分析 1.进程的描述 进程控制块PCB——task_struct,为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_struct ...
- day9---多线程,线程锁,队列
进程.线程 http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 使用threading模块实现多线程编程[综述] Pyt ...
- MVVM框架中的一个非常重要的内容:数据双向绑定
双向绑定的意思就是,如下图中,当在input框中输入字符时,红色框框中的字也会随之改变. input框中需要一个绑定:ms-duplex(即“双工绑定”),http://avalonjs.github ...
- IOS 通过苹果开放API检测更新
#define APPID @"1067207206" -(void)onCheckVersion { NSDictionary *infoDic = [[NSBundle mai ...
- MongoDB之TextSearch简介
MongoDB之TextSearch简介 MongoDB支持对文本内容执行文本搜索操作,其提供了索引text index和查询操作$text来完成文本搜索功能.下面我们通过一个简单的例子来体验一下M ...
- TclError: no display name and no $DISPLAY environment variable
%matplotlib inline 或 %matplotlib notebook