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

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

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

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

https://github.com/leandromoreira/digital_video_introduction

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

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

往期内容:

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

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

帧类型

现在我们进一步消除时间冗余,但在这之前让我们来确定一些基本术语。假设我们一段 30fps 的影片,这是最开始的 4 帧。

 ->  ->  -> 

我们可以在帧内看到很多重复内容,如蓝色背景,从 0 帧到第 3 帧它都没有变化。为了解决这个问题,我们可以将它们抽象地分类为三种类型的帧。

I 帧(帧内编码,关键帧)

I 帧(可参考,关键帧,帧内编码)是一个自足的帧。它不依靠任何东西来渲染,I 帧与静态图片相似。第一帧通常是 I 帧,但我们将看到 I 帧被定期插入其它类型的帧之间。

球 1

P 帧(预测)

P 帧利用了一个事实:当前的画面几乎总能使用之前的一帧进行渲染。例如,在第二帧,唯一的改变是球向前移动了。仅仅使用(第二帧)对前一帧的引用和差值,我们就能重建前一帧。

 <-  

自己动手:具有单个 I 帧的视频

既然 P 帧使用较少的数据,为什么我们不能用单个 I 帧和其余的 P 帧来编码整个视频?

编码完这个视频之后,开始观看它,并快进到视频的末尾部分,你会注意到它需要花一些时间才真正跳转到这部分。这是因为 P 帧需要一个引用帧(比如 I 帧)才能渲染。

你可以做的另一个快速试验,是使用单个 I 帧编码视频,然后再次编码且每 2 秒插入一个 I 帧,并比较成品的大小

B 帧(双向预测)

如何引用前面和后面的帧去做更好的压缩?!简单地说 B 帧就是这么做的。

   <-     ->   

自己动手:使用 B 帧比较视频

你可以生成两个版本,一个使用 B 帧,另一个全部不使用 B 帧,然后查看文件的大小以及画质。

小结

这些帧类型用于提供更好的压缩率,我们将在下一章看到这是如何发生的。现在,我们可以想到 I 帧是昂贵的,P 帧是便宜的,最便宜的是 B 帧。

帧类型例子

推荐阅读:

Android OpenGL 学习专辑

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

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

FFmpeg 学习专辑

觉得不错,点个在看呗~


相关文章:

  • 【数字视频技术介绍】| 编码中的时间冗余和空间冗余
  • 错误终结者: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,你必须知道的那些玩意儿
  • CSS盒模型深入
  • idea + plantuml 画流程图
  • Laravel Mix运行时关于es2015报错解决方案
  • Laravel核心解读--Facades
  • maven工程打包jar以及java jar命令的classpath使用
  • tab.js分享及浏览器兼容性问题汇总
  • 百度地图API标注+时间轴组件
  • 高性能JavaScript阅读简记(三)
  • 开源地图数据可视化库——mapnik
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 一起参Ember.js讨论、问答社区。
  • Java总结 - String - 这篇请使劲喷我
  • 昨天1024程序员节,我故意写了个死循环~
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #LLM入门|Prompt#3.3_存储_Memory
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • $L^p$ 调和函数恒为零
  • (02)vite环境变量配置
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (ibm)Java 语言的 XPath API
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (六)vue-router+UI组件库
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (五)网络优化与超参数选择--九五小庞
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .NET Core跨平台微服务学习资源
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET 反射 Reflect
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .Net7 环境安装配置
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET中使用Protobuffer 实现序列化和反序列化
  • .net专家(高海东的专栏)
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @Bean, @Component, @Configuration简析
  • @EnableWebMvc介绍和使用详细demo