当前位置: 首页 > news >正文

【数字视频技术介绍】| 编码中的时间冗余和空间冗余

公众号回复:666,领取学习资源大礼包

这是一份循序渐进的视频技术的介绍,来自 Github 仓库:

https://github.com/leandromoreira/digital_video_introduction

本文档旨在尽可能使用浅显的词语,丰富的图像和实际例子介绍数字视频概念,使这些知识能适用于各种场合。

有兴趣了解更多内容的同学可以下载仓库源码,这里只做摘录,仅供参考。

往期内容:

  1. 数字视频技术介绍 之 基本术语

  2. 【数字视频技术介绍】| 消除冗余 之 颜色模型

  3. 【数字视频技术介绍】| 视频帧类型(I 帧、P 帧、B 帧)

时间冗余(帧间预测)

让我们探究去除时间上的重复,去除这一类冗余的技术就是帧间预测

我们将尝试花费较少的数据量去编码在时间上连续的 0 号帧和 1 号帧。

原始帧

我们可以做个减法,我们简单地用 0 号帧减去 1 号帧,得到残差,这样我们就只需要对残差进行编码

残差帧

但我们有一个更好的方法来节省数据量。首先,我们将0 号帧 视为一个个分块的集合,然后我们将尝试将 帧 1帧 0 上的块相匹配。我们可以将这看作是运动预测

维基百科—块运动补偿

“运动补偿是一种描述相邻帧(相邻在这里表示在编码关系上相邻,在播放顺序上两帧未必相邻)差别的方法,具体来说是描述前面一帧(相邻在这里表示在编码关系上的前面,在播放顺序上未必在当前帧前面)的每个小块怎样移动到当前帧中的某个位置去。”

原始帧运动预测

我们预计那个球会从 x=0, y=25 移动到 x=6, y=26xy 的值就是运动向量进一步节省数据量的方法是,只编码这两者运动向量的差。所以,最终运动向量就是 x=6 (6-0), y=1 (26-25)

实际情况下,这个球会被切成 n 个分区,但处理过程是相同的。

帧上的物体以三维方式移动,当球移动到背景时会变小。当我们尝试寻找匹配的块,找不到完美匹配的块是正常的。这是一张运动预测与实际值相叠加的图片。

运动预测

但我们能看到当我们使用运动预测时,编码的数据量少于使用简单的残差帧技术。

运动预测 vs 残差

你可以使用 jupyter 玩转这些概念。

自己动手:查看运动向量

我们可以使用 ffmpeg 生成包含帧间预测(运动向量)的视频。

  

ffmpeg 帧间预测(运动向量)

或者我们也可使用 Intel® Video Pro Analyzer(需要付费,但也有只能查看前 10 帧的免费试用版)。

  

Intel® Video Pro Analyzer 使用帧间预测

空间冗余(帧内预测)

如果我们分析一个视频里的每一帧,我们会看到有许多区域是相互关联的

空间内重复

让我们举一个例子。这个场景大部分由蓝色和白色组成。

smw 背景

这是一个 I 帧,我们不能使用前面的帧来预测,但我们仍然可以压缩它。我们将编码我们选择的那块红色区域。如果我们看看它的周围,我们可以估计它周围颜色的变化

smw 背景块

我们预测:帧中的颜色在垂直方向上保持一致,这意味着未知像素的颜色与临近的像素相同

smw 背景预测

我们的预测会出错,所以我们需要先利用这项技术(帧内预测),然后减去实际值,算出残差,得出的矩阵比原始数据更容易压缩。

smw 残差

自己动手:查看帧内预测

你可以使用 ffmpeg 生成包含宏块及预测的视频。请查看 ffmpeg 文档以了解每个块颜色的含义。

  

ffmpeg 帧内预测(宏块)

或者我们也可使用 Intel® Video Pro Analyzer(需要付费,但也有只能查看前 10 帧的免费试用版)。

  

Intel® Video Pro Analyzer 帧内预测

推荐阅读:

头条内推啦,包括但不限于音视频方向,HR 小姐姐在线答疑

移动端技术交流喊你入群啦~~~

推荐几个堪称教科书级别的 Android 音视频入门项目

觉得不错,点个在看呗~

相关文章:

  • 错误终结者:Fragment在ViewPager中的正确应用
  • 如何理解图片采样,这应该算是基础知识吧?
  • Android OpenGL ES 实现 3D 阿凡达效果
  • 音视频开发入门必备之基础知识
  • 6/6 音视频技术大咖在线直播,教你开发者硬核个人成长指南
  • 关于多线程,你必须知道的那些玩意儿
  • Android Camera2 实现高帧率预览录制(附源码)
  • 自定义相机中如何实现二维码扫描功能
  • 渐变过渡的相册(shader)
  • 【C++11新特性】 C++11 智能指针之shared_ptr
  • 【C++11新特性】 C++11智能指针之weak_ptr
  • 5 个 IDEA 必备插件,让效率成为习惯
  • 【C++11新特性】 C++11智能指针之 unique_ptr
  • 关于JVM,你必须知道的那些玩意儿
  • OpenGL ES 实现动态(水波纹)涟漪效果
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • Asm.js的简单介绍
  • PHP的类修饰符与访问修饰符
  • Python语法速览与机器学习开发环境搭建
  • spring-boot List转Page
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 开发基于以太坊智能合约的DApp
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • linux 淘宝开源监控工具tsar
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #if #elif #endif
  • #Linux(权限管理)
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (十三)Flask之特殊装饰器详解
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .Net6使用WebSocket与前端进行通信
  • .net反编译的九款神器
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .project文件
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [100天算法】-二叉树剪枝(day 48)
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [ffmpeg] aac 音频编码
  • [Git].gitignore失效的原因