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 ...
随机推荐
- 电子数字 网易游戏在线笔试 第一题 hihocoder
题目链接 http://hihocoder.com/contest/ntest2016spring1/problem/1 这个题目有几个算法考点: (1)对于一个LED数码管(由7个发光二极管封装在一 ...
- Python 学习---------Day2
第四章 介绍Python对象类型为什么使用内置类型 内置对象使程序更容易编写 内置对象是拓展的组件 内置对象往往比定制的数据结构更有效率 内置对象是语言标准的一部分Python的核心数据类型 数字 字 ...
- (转)详解Linux Top 命令
top 命令是最流行的性能监视工具之一,我们必需了解.它是一个优秀的交互式工具,用于监视性能.它提供系统整体性能,但报告进程信息才是 top 命令的长处.top 命令交互界面如下图所视:
- 【dubbo】dubbo项目基本结构及provider构建
dubbo项目基本结构如下,分别部署于不同服务器: 1.provider(接口API 实现) 2.consumer(web) 3.zookeeper 4.DB provider构建 1.api构建 i ...
- Linux搭建Scrapy爬虫集成开发环境
安装Python 下载地址:http://www.python.org/, Python 有 Python 2 和 Python 3 两个版本, 语法有些区别,ubuntu上自带了python2.7. ...
- SQL入门经典(七) 之脚本和批处理
什么是脚本.我们前面学的CREATE TABLE <table name> ,USE <database name>这些都是脚本,为什么用脚本.脚本存储到文件中并且可以重复利用 ...
- 淘宝上倒卖新浪微盘事件来龙去脉——谈谈巧用IMEI
这是一个老黄历的事件,曾记得淘宝上的卖家卖10元卖50g网络硬盘,并且卖的相当的火,一个月就卖了500个账号.由于我也是那个事件的亲身经历者之一,这里就看到了IMEI号在项目中防止作弊是何其的重要. ...
- 分享:写了一个 java 调用 C语言 开发的动态库的范例
分享:写了一个 java 调用 C语言 开发的动态库的范例 cfunction.h 代码#pragma once#ifdef __cplusplusextern "C" {#e ...
- 关于最近的CSRF攻击
摘要 最近公司内部爆出一大波页面没有加token校验,然后各路大神就开始进行CSRF攻击了.CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求.CSRF能够做的事情包括:以你名义发送邮件,发消 ...
- [教程]怎么用百度云观看和下载"磁力链接"无需下载直接观看.
1, 打开网址 http://okbt.net/ 输入你想要看的电影名字, 点搜索,鼠标右键点击拷贝磁力链接.或者 电脑装了迅雷的话.可以直接点击.用迅雷下载. 磁力链接都是这种格式的.例: mag ...