FFmpeg 之I、B、P帧的基本编码原理,太完整了

给大家分享一份移动架构大纲,包含了移动架构师需要掌握的所有的技术体系,大家可以对比一下自己不足或者欠缺的地方有方向的去学习提升;移动架构师需要掌握的所有的技术体系,大家可以对比一下自己不足或者欠缺的地方有方向的去学习提升;**[外链图片转存中…(img-MkspGtsJ-1711558500969)]本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录。
摘要由CSDN通过智能技术生成

19956127-1d7961a60dae9221

I帧的压缩编码算法

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

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

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

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

因为RLE在编码时,对相同的数值只编码一次,同时

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在视频编码中,分为三种类型:I(Intra-coded picture,编码图像)、P(Predictive-coded picture,间预测编码图像)和B(Bidirectional-predictive-coded picture,双向预测编码图像)。 I是完全独立的,不依赖于其他进行解码。通常情况下,每个GOP(Group of Pictures,一组连续的)的第一都是I。 P和B都是依赖于其他进行解码的。P(前向预测)是由前面的I或P进行预测得到的,而B(双向预测)是由前后两个I或P进行预测得到的。 要提取视频中的I、P和B,可以使用视频编解码器库,如FFmpeg。具体的操作步骤如下: 1. 安装FFmpeg库,并将其加入系统环境变量中。 2. 打开命令行窗口(Windows)或终端(Linux/Mac),进入存放视频文件的目录。 3. 输入以下命令,提取I: ``` ffmpeg -i input.mp4 -vf "select=eq(pict_type\,I)" -vsync vfr output_%04d.jpg ``` 其中,input.mp4为输入视频文件,output_%04d.jpg为输出的I图片文件名,%04d表示输出的文件名中数字部分的位数为4位。可以根据需要修改输出文件的格式和存放路径。 4. 输入以下命令,提取P: ``` ffmpeg -i input.mp4 -vf "select=eq(pict_type\,P)" -vsync vfr output_%04d.jpg ``` 5. 输入以下命令,提取B: ``` ffmpeg -i input.mp4 -vf "select=eq(pict_type\,B)" -vsync vfr output_%04d.jpg ``` 执行以上命令后,FFmpeg会将视频中的I、P和B提取出来,并保存为图片文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值