MPEG-1中I、B、P帧的基本编码原理

2023-11-13

在上篇文章中,我们对MPEG-1有了一个轮廓性的介绍,知道视像序列中的图像类型有三种,分别为I帧、P帧、和B帧。但是我们并没有更深入的去了解,编码这三种类型的图像数据时所采用的不同方式,只知道它们都是把图像分为以16x16像素的宏块、8x8像素的图块为基本单元进行处理的。而实际上,编码I、P、B三种类型的图像数据的方式并不相同,不过在进一步展开之前,我们先来讲讲为什么要在这个时候讲这个。

我们都知道MPEG标准的制定,是一步一步来的,有了MPEG-1之后,才有MPEG-2、-4和H.264/AVC。而在这一步又一步的拓展和优化中,后者总是继承前者,并对前者的不足进行改善和加强。而对于MPEG-2也是这样,它的编码原理来自MPEG-1,而又在MPEG-1的基础上,做了一些加强。所以如果想要了解MPEG-2,就必须要对MPEG-1的编码原理,有个基本的认识。

我想这就是自底向上的本质,也是我们不谋而合,在这个系列所采取的方法。所以下面我们开始介绍I、B、P帧的基本编码原理,注意是基本,说明我们并不会深入去探讨某一个方法,如DCT变换、量化、DPCM、RLE、霍夫曼编码、算术编码。只需要掌握以下两点即可:

  • 1、对编码流程有一定的了解
  • 2、了解I、B、P帧三者编码的不同

1、I帧的基本编码原理

上篇说过,MPEG-1主要在时间冗余和空间冗余两个方向上,去除冗余数据。时间冗余是帧与帧之间产生的冗余数据,而空间冗余则是单帧图像中,相邻像素间产生的冗余数据。对于I帧来说,因为它是关键帧,既不需要参考过去的帧,也不需要参考将来的帧。所以对I帧的编码,是为了消除空间冗余数据,而且它采用的压缩算法,和JPEG类似。如下图:

在这里插入图片描述
I帧的压缩编码算法

从图中可以看到,如果图像是用RGB颜色空间表示的,则首先把它转换成用YCbCr空间表示的图像。然后每个图像平面分成8x8像素的图块,并对每个图块进行离散余弦变换(DCT)。

这里DCT的作用非常大,看它的名字可能会觉得非常高大上,其实它就是一个矩阵变换。关于它其实都可以专门写一篇文章出来,不过这里我们只需要知道它的作用即可。DCT简单点来说,它就是将前面8x8像素图块的颜色空间数据,分为高频数据和低频数据,所以我们也常说,DCT是把数据从空间域转换到频率域。

那什么是高频和低频呢?这里的高频数据是指,图像颜色的变化比较强烈的地方,比如人像画的轮廓与背景的交叉处,在这里的色值变化很快,所以称为高频。相对的低频就是指,颜色变化比较缓和的地方。所以DCT的作用并不是对数据进行压缩,而是为了方便后面的操作,比如量化、RLE行程编码、以及霍夫曼编码。

下一步就是量化,因为人眼对高频区域其实并不敏感,所以利用这一点,可以将高频部分数据进行压缩。这样一来,图块的数据就会呈现两部分,一部分是变化平滑的低频数据,另一部分是刚压缩过的高频部分,数值也变得差不多。而后再经过Zig-zig编排,数据就会呈现出连续几个值相同的的形式,比如23334551550000。这样一来,再经过RLE行程编码,就可以去掉连续值相同的冗余数据。

因为RLE在编码时,对相同的数值只编码一次,同时计算相同数值重复的次数,因此称为行程编码。而与RLE处于同级的DPCM,则主要是对图块与图块之间的差值进行编码。这样一来可以再次压缩数据,之后再通过霍夫曼编码或者算术编码,编码操作也就完成了。同样霍夫曼编码和算术编码,也可以单独写一篇文章出来。

2、P帧的基本编码原理

P帧也就是预测图像P,与I帧不同的是,它不仅要从空间上去除冗余数据,还要从时间冗余方面上着手,因为它是以在它之前出现的I帧作为参考对象来编码的。与I帧不同的是,预测图像P的编码是以16x16像素的宏块为基本编码单元的。对于P帧,为了表示它与前面I帧的关系,我们会一直用预测图像和参考图像这两个词。

其实很好想象,因为对预测图像编码,就是对它和参考图像直接的差值进行编码。所以我们只需要做到以下两点即可:

  • 1、算出当前要编码的图像宏块,与参考图像宏块之间的差值
  • 2、计算出宏块的移动矢量

比如下图:
在这里插入图片描述

这张图应该一目了然,时刻1中的人像,在时刻2移动到了图像右侧。这个过程中变化的,不只是人像的位置,因为人在移动的时候,会有其他的动作,比如低头、转头、仰头等动作。所以我们并不仅仅要计算出人像变化之后的位置,也就是移动矢量,还要计算出两个宏块之间的差值。

当然这两者在编码过程中,是有个先后关系的。比如我要计算出宏块的移动矢量,那我得找到参考图像中的宏块,在预测图像中的位置吧。而更进一步,那我怎么找到预测图像相对于参考图像中,图块的位置呢?答案是预测图像中的某个宏块,与参考图像中的这个宏块的差值最小,也即最佳匹配宏块。

这就引起了一系列的搜索算法,去预测图像中去找这个宏块,比如二维对数搜索法、三步搜索法、对偶搜索法。而对预测图像P的编码所引起的时间,则主要是执行这个搜索算法所占用的时间。

等找到最佳匹配宏块后,计算出差值和移动矢量,剩下的操作就和对I帧的编码一致了。

在这里插入图片描述
预测图像P的压缩编码算法

3、B帧的基本编码原理

B帧也是双向预测图像B,对它的编码,即是对它前后帧的像素值之差进行编码,具体的方法和对预测图像P的算法类似。

在这里插入图片描述
双向预测图像B的压缩编码算法

总结

从以上介绍就可以看出,I帧是对视频最重要的图像帧,P帧其次,B帧更次。所以B帧的压缩比也是最高的,P帧其次,I帧压缩比最小。在实际应用中,对于快速运动的图像,I帧的频率可以高一些,B帧的数目可以少一些。而对于慢速运动的图像,则相反。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MPEG-1中I、B、P帧的基本编码原理 的相关文章

  • 视频编解码

    色彩格式 参考链接 xff1a https blog csdn net luanfenlian0992 article details 124992465 rgb yuv 编码格式 参考链接 xff1a https blog csdn ne
  • 【H.264/AVC视频编解码技术详解】十七:帧内预测编码的预测实现方法

    H 264 AVC视频编解码技术详解 视频教程已经在 CSDN学院 上线 视频中详述了H 264的背景 标准协议和实现 并通过一个实战工程的形式对H 264的标准进行解析和实现 欢迎观看 纸上得来终觉浅 绝知此事要躬行 只有自己按照标准文档
  • VTM新手踩坑

    VTM踩坑实录 1 编码后yuv文件打开异常 2 编码帧数偏少 3 VTM命令行参数 1 编码后yuv文件打开异常 利用ffmpeg播放改文件 命令行 ffplay video size 宽x高 i file name yuv 时出现该画面
  • x264的参考帧管理机制

    x264介绍 X264是一款研究的是H 264编码的开源代码软件 相比JM而言 其编码性能有很大的提高 其支持大多数H 264的特性工具 包括 CABAC和 CAVLC高效嫡编码 多参考帧预测 所有的帧内预测宏块类型 16x6l和4x4 所
  • vlc-android配置实录

    听说vlc底层也用的ffmpeg 免费开源的 业界做的不错的 就来看看 从网上找了很多例子 也从github上找了好多demo 好多都不全 或者下载下来编译失败 官网上下载的vlc android就编译失败 下面列两个可以用的 一 有vlc
  • 解决:无法解析的外部符号__iob_func

    解决 无法解析的外部符号 iob func 原文 http blog csdn net hebbely article details 53780562 在使用 VS2015 下使用 libjpeg turbo 静态库 编译时报错了 cpp
  • Ubuntu环境下安装ffmpeg

    1 创建安装 录 sudo mkdir p usr local ffmpeg lib 2 下载ffmpeg源码 Download FFmpeg 3 解压源文件 4 到指定ffmpeg目录进行配置 cd ffmpeg 4 3 2 配置 con
  • C++ gstreamer函数使用总结

    目录 1 GSteamer的基本API的使用 这个播放mp4报错 这个创建play bin 返回0 不能运行 这个值得看 2 创建元件并且链接起来 3 添加衬垫 添加回调 手动链接衬垫 4 打印gstreamer的版本信息 5 gstrea
  • C++ opencv处理kinect红外数据和彩色数据

    kinect好像已是明日黄花 但现在需要用这个做交互的人还不少 要做手势识别 于是入手一枚二手kinect2 0 入坑玩玩 做手势识别 直觉上要用opencv 从网上搜的资料来看 大多是通过openNi来操作kinect 而且要openNi
  • MPEG I,B,P的顺序

    MPEG视频压缩算法的特点 数字化后的数据量之大非常惊人 如果不对原始视频图像数据进行压缩 则在与VCD 相同的光盘上只能存储20秒钟的中等分辨率 彩色视频图像 和JVC公司在制定VCD标准时采用了MPEG 1数字图像压缩编码国际标准 IS
  • 从mpeg ts文件中提取I帧(3):pes包的解析

    本系列的第一篇文章讲解了如何把ts包拼装为pes包 本章主要讲解如何解析pes包 一 pes包的格式如下图所示 二 相关字段解析 packet start code prefix 标识包起始端的包起始码 固定值为 0000 0000 000
  • Nvidia Jetson 编解码开发(6)Jetpack 4.x版本Multimedia API 硬件编码开发--输入端对接Camera V4L2采集

    1 前言 Nvidia Jetson 编解码开发 2 Jetpack 4 x版本Multimedia API 硬件编码开发 集成encode模块 free xx的博客 CSDN博客 基于上篇继续开发 由于上篇只集成了encode模块 但是编
  • 详解JPEG编码格式

    参考文章1 参考文章2 MJPEG是一种视频压缩格式 其中的每一帧图像都使用JPEG编码 实际上 M J P E G
  • 【分享NVIDIA GTC 23大会干货】在 GPU 上使用 Video Codec SDK,CV-CUDA 和 TensorRT 加速现代云上视频应用 [SE51229]

    在 GPU 上使用 Video Codec SDK CV CUDA 和 TensorRT 加速现代云上视频应用 前言 基于现代 的视频流水线架构与运用场景 NVIDIA 视频处理的工具集 1 视频编解码工具 2 前后处理部分 CV CUDA
  • g++ 编译pybind

    简单的 g O3 march native Wall shared std c 11 fPIC undefined python3 m pybind11 includes example cpp o example python3 conf
  • H.264 入门篇 - 10 (帧间预测 - 参考帧列表修改/重排)

    目录 0 写在前面 1 参考帧列表修改 重排 1 1 短期参考帧的修改 1 1 1 计算 picNumLXPred 1 1 2 计算 picNumLXNoWrap 1 1 3 计算 picNumLX 1 1 4 修改参考帧列表 1 2 长期
  • MPEG-1中I、B、P帧的基本编码原理

    在上篇文章中 我们对MPEG 1有了一个轮廓性的介绍 知道视像序列中的图像类型有三种 分别为I帧 P帧 和B帧 但是我们并没有更深入的去了解 编码这三种类型的图像数据时所采用的不同方式 只知道它们都是把图像分为以16x16像素的宏块 8x8
  • 【视频编码学习】VTM15.0编译运行

    VTM版本 15 0 操作系统 Win10 x64位 IDE Visual Studio 2019 编译器 cmake 利用VS2019运行VTM15 0 前言 一 下载VTM15 0 二 下载安装cmake 1 下载cmake并安装 2
  • 从mpeg ts文件中提取I帧(6):I帧的显示

    I帧的显示依赖于opencv 这里用到的版本是3 4 0 显示的数据是pes解码后的rgb数据 代码比较简单 用opencv主要考虑到以后可以对ts流进行一些特征识别 include
  • ffmpeg错误码

    cpp view plain copy AVERROR BSF NOT FOUND 1179861752 AVERROR BUG 558323010 AVERROR DECODER NOT FOUND 1128613112 AVERROR

随机推荐

  • 最大熵算法及简单例子

    最近在学模式识别 正在看Introduction to Pattern Recognition这本书 挺不错的一本书 好 下面和大家一起来学习最大熵算法 首先 最大熵算法是干什么的呢 一般是用来估计一个分布 至于把分布估计出来之后用来干什么
  • 程序员必备的画图工具

    作者 CUGGZ 来源 前端充电宝 XMind 是一个跨平台的思维导图软件 具有多种结构样式 除了普通的思维导图 还包括树形图 逻辑图 鱼骨图 时间轴 树状表格等等 不同的结构样式可以自由组合混用 同时支持一键更换结构样式 最近经常有小伙伴
  • 编译安装 Nginx 提示:/configure: error: C compiler cc is not found

    问题产生背景 反向代理服务器需要增加探活功能 需要对前置nginx 进行重新编译安装第三方模块 发现在编译安装配置时候一直过不去 百度查询过很多解决办法 基本都是没有安装好编译环境之类的说法 但是在确定编译环境所涉及的包全部都安装以后 还是
  • idea必备开发插件.

    1 lombok 支持lombok的各种注解 从此不用写getter setter这些 可以把注解还原为原本的java代码 非常方便 https plugins jetbrains com plugin 6317 lombok plugin
  • 2022 RoboCom 世界机器人开发者大赛-本科组(省赛)-RC-u5 树与二分图

    2022 RoboCom 世界机器人开发者大赛 本科组 省赛 RC u5 树与二分图 文章目录 2022 RoboCom 世界机器人开发者大赛 本科组 省赛 RC u5 树与二分图 题目描述 输入格式 输出格式 输入样例 输出样例 思路 A
  • 感知机分类学习

    感知机 perceptron 是一种二类分类的线性分类模型 也就是说 使用于将数据分成两类的 并且数据要线性可分的情况 线性可分是指存在一个超平面能够将空间分成两部分 每一部分为一类 感知机的目的就在于找这样的一个超平面 假设输入数据形式为
  • pandas入门

    pandas is a fast powerful flexible and easy to use open source data analysis and manipulation tool 一 读取文本文件中的数据 导入pandas
  • Python之创建多级菜单

    方法一 usr bin env python coding utf 8 Time 2021 11 25 19 09 Author Argonaut FileName 创建多级菜单 py 功能 可进可退的功能菜单 while True pri
  • 将C盘和桌面所在的E盘合并分区后,出现的路径问题解决方案

    问题一 开机时出现警告 由于启动计算机时出现页面配置问题 Windows在您的计算机上创建了一个临时页面文件 所有的磁盘驱动器的总页面大小可能稍大于您所指定的大小 解决方案 照着做就行 问题二 Windows 10系统开机显示 位置不可用C
  • shell脚本整段注释

    摘自 http zhidao baidu com link url XmCCZmfluRe6n8TjPRKJTx4GGOUPSGX1VNBm euqGdpKGpveTESxC0HL90UBNT5nZCvmvfq2oIJdP3JO5EoPSq
  • STM32关于PVD低电压能检测的知识

    在实际工程运用中需要对突发情况作出及时的相应 通常都需要考虑当系统电压下降或断电时 需要对控制系统加以保护 这时候就需要在程序中加入系统电压监测 PVD 供电电压降低到某一个电压值时 需要系统进入保护状态 执行紧急关闭任务 对系统数据进行保
  • DDR基础知识点汇总

    文章目录 文档推荐 DDR颗粒的电路图来源 DDR3 SDRAM电路结构高清图 DDR4 SDRAM电路结构高清图 DDR3 1866控制器 PHY 颗粒之间的带宽关系 channel gt DIMM gt rank gt chip gt
  • docker镜像中配置文件的修改

    docker镜像中配置文件的修改 需要修改docker里面的配置文件时 因为docker镜像里面没有vim 下载也比较麻烦 可以使用 docker cp docker镜像名 想要修改的文件的路径 想要复制到的路径 将镜像中的文件复制到镜像外
  • ARM芯片开发(S5PV210芯片)——定时器、看门狗、RTC

    1 计数器 计数器就是每隔一段固定的时间计数值就加一 于是我们可以根据计数值来计算时间 经过的时间 计数值x计数时间间隔 2 定时器 2 1 定时器介绍 定时器具有计时的功能 类似于我们手机自带的倒计时功能 比如我们先给定时器设置计时一小时
  • 从瀑布到敏捷——漫画解读软件开发模式变迁史

    网址 https www tapd cn forum view 36971 从文章中可知 1 瀑布模型 将客户隔绝在外并按顺序逐一完成的模式 从时间上来说 只有等上一交付件完成了 下一阶段才能开始是一种浪费 特点 文档驱动 单道生产 2 敏
  • JVM--基础--21--对象的内存布局

    JVM 基础 21 对象的内存布局 1 普通对象实例与数组对象实例的数据结构图 2 在HotSpot虚拟机中 对象在内存中存储的布局如下 2 1 对象头 Header 2 1 1 markword 用于存储对象自身的运行时数据 如哈希码 H
  • 递增二叉树-网易游戏

    递增二叉树 网易游戏 题目描述 给定一个二叉树 每个节点有一个正整数权值 若一棵二叉树 每一层的节点权值和都严格小于下一层的结点权值和 责成这棵二叉树为递增二叉树 现在给你一棵二叉树 你需要判断其是不是一棵递增二叉树 输入描述 输入的第一行
  • Redis的数据结构之bitmap

    背景 项目开发过程中 我们经常会使用boolean类型来存储数据 例如记录用户每天签到 签到了是1 没签则为0 如果我们需要统计一年内的签到数 如果采用String来存储 需要每个用户都要记录 365次 当用户数量非常大时 需要的存储空间非
  • Docker基础入门:镜像、容器导入导出与私有仓库搭建

    Docker基础入门 镜像导入导出与私有仓库搭建 一 Docker镜像 容器的导入和导出 1 1 Docker镜像的导出 1 2 Docker镜像的载入 1 3 Docker容器的导出 1 4 Docker容器的导入 二 镜像和容器导出和导
  • MPEG-1中I、B、P帧的基本编码原理

    在上篇文章中 我们对MPEG 1有了一个轮廓性的介绍 知道视像序列中的图像类型有三种 分别为I帧 P帧 和B帧 但是我们并没有更深入的去了解 编码这三种类型的图像数据时所采用的不同方式 只知道它们都是把图像分为以16x16像素的宏块 8x8