首页 > 其他分享 >ffmpeg简易播放器(1)--了解视频格式

ffmpeg简易播放器(1)--了解视频格式

时间:2025-01-17 12:53:50浏览次数:1  
标签:视频 顺序 ffmpeg -- 解码 像素 视频格式 播放 一帧

视频帧

对于一份视频,实质上是多张图片高速播放形成的。每一张图片即为该视频的一帧。而每秒钟播放的图片张数便为所谓的帧率(Frame Rate/Frame Per Second)。常见的帧率有24fps(即一秒播放24张图片),60fps(一秒播放60张图片)等。也就是说,对于一个时长60秒的图片,如果帧率为24fps,那么这个视频便有60*24=1440帧。

image

上图是一张常见的1920*1080分辨率的屏幕截图,格式为png。可以看到其大小为1.2MB。而对于一部电影来说,假设电影时长一个小时,也就是3600秒,假设帧率为24fps,那么这部电影便有3600*24=86400帧。如果每一帧都保存为png格式,那么这部电影的大小便是86400*1.2MB=103.68GB。也就是一部1080p高清的电影竟然需要103个G!这是不可接受的。而对于4k分辨率(3840*2160)的视频,那存储所需要的空间只会更多。如何解决这个问题呢?

编码与解码

为了解决视频存储空间过大的问题,人们发明了视频编码技术。可以想象一个数字序列
\(111111555666\),可以看出他其实有许多重复的部分,因此我们可以定义这样一种方式来表示\(165363\)表示6个1,3个5,3个6,这样我们就可以用更少的数字来表示原来的数字序列。

让我们回到视频,对于一个视频,为了保证播放时的效果不割裂,相邻两帧的内容实际上是非常相似的,因此我们只需要记录这一帧与前一帧的差异像素即可,不需要保存这一帧所有的像素。这样就大大减少的所需的存储空间,播放时再利用前帧的像素加上差异像素得出这一帧的像素进行解码即可。实际上的编解码策略会更加复杂多样。

I,P,B帧

在编码时,视频帧被分为三种类型:I帧,P帧,B帧。

  • I帧,保留原始图片的所有像素信息,无需参考其他帧便可获取完整的图片,通常作为其他帧的参考
  • P帧,前向预测帧,解码时需要参考前一帧的I帧或P帧,通过前一帧的像素信息加上差异像素信息得到当前帧的像素信息
  • B帧,双向预测帧,解码时需要参考前一帧的I帧或P帧和后一帧的I帧或P帧,通过前后帧的像素信息加上差异像素信息得到当前帧的像素信息

不难看出,I帧的编码效率是最低的,而P帧保留与前一帧的差异像素,编码效率较高,B帧保留与前后帧的差异像素,大部分信息来自于前后帧,自身保留的信息较少,编码效率最高。编码时将多个帧组成一个GOP(Group of Picture,即图像组),GOP中的第一帧一定为I帧,最后一帧一定为P帧,中间一般为P帧与B帧的规律性排列。下图便为一个图像组的排列。

image

图中每一个箭头的起始为提供信息的帧,箭头指向需要该信息进行解码的帧。可以看出没有任何箭头指向I帧,因为I帧不需要参考其他帧即可解码。图中的每个P帧均只有一个前向的箭头指向它们,箭头的来源可能是P帧也可能是I帧。而每个B帧仅有箭头指向它们,而且箭头的数量均为2,来源分别为该B帧前面的I帧或者P帧以及后面的I帧或者P帧。

pts与dts

由上图可以看出来,在一个图像组中,播放的顺序应该为

I->B->B->P->B->B->B->P

但是由于IPB帧解码规则的设计,解码的顺序与播放的顺序并不一致,解码时,一般会先读取一个I帧,然后跳过B帧先去解码第一个P帧,接着跳回来使用解码后的I,P帧去解码B帧,之后在跳过B帧去解码第二个P帧,然后跳回来解码两个P帧间的B帧,循环这个操作。这也正符合P帧依赖前帧,B帧依赖前后帧的逻辑,也就是说上图的解码顺序为

I->P->B->B->P->B->B->B

参考博客

显然解码的帧顺序与显示的帧顺序截然不同,如果我们想直接顺序的解码一帧就显示一帧的话,整个的视频就乱套了。而且在解码和播放时图片本身是不含时间信息的,也就是说他自己不知道自己这一帧应该在什么时候被解码,在什么时候被播放,因此需要一个索引来指示每一帧的解码顺序,与播放顺序,这便是pts与dts。

  • PTS(Presentation Time Stamp),显示时间戳,指示该帧应该在什么时候被显示
  • DTS(Decode Time Stamp),解码时间戳,指示该帧应该在什么时候被解码

以上图为例,一个图像组的pts与dts分别为

    I->B->B->P->B->B->B->P
pts:1  2  3  4  5  6  7  8
dts:1  3  4  2  6  7  8  5

(OS:这里只是做一个示例,实际上可能不同,错了的话请评论批评QWQ)
这样的话,在解码时按照dts的顺序进行解码,而播放时使用pts进行播放。因此在解码时可能并不能解码一帧就能获取一个播放帧,因为P帧以及B帧依赖其他帧的信息,因此在解码时可能需要等待其他帧的解码结果。

对于不同的编码格式,一个图像组的IPB帧的个数以及排列都有可能是不一样的。

标签:视频,顺序,ffmpeg,--,解码,像素,视频格式,播放,一帧
From: https://www.cnblogs.com/CrescentWind/p/18676730

相关文章

  • 【分享】 100+ 套开源大数据可视化大屏Html5模板,全网最炫!
    今天给大家分享100+套开源大数据可视化炫酷大屏Html5模板,全网最新、最多、最全、最酷、最炫的大数据可视化模板!项目介绍BigDataView提供了100+套大数据可视化炫酷大屏Html5模板,涵盖了社区、物业、政务、交通、金融银行等多个行业。这些模板被认为是全网最新、最多、最全、最酷......
  • 基于Matlab的RCS(雷达散射截面)计算案例
    基于Matlab的RCS(雷达散射截面)计算案例。利用时域有限差分法(FDTD)的计算电磁学手段,给出了较为准确的结果。 列表RCS.m , 25555......
  • Linux 查看目录下的文件夹命令与 find 查找某个目录但不包括该目录本身
    在Linux系统中,管理和查找文件及文件夹是日常运维和开发过程中常见的任务。本文将介绍如何查看目录下的文件夹,并使用 find 命令查找特定目录下的内容,但排除该目录本身。我们将详细讨论以下内容:使用 ls 命令查看目录下的文件夹。使用 find 命令查找特定目录内容并排除该......
  • 解锁云电脑爽玩TGA游戏,ToDesk、海马云等多款云电脑游戏横测
    1.引言1.1先认识下云电脑云电脑技术是一种将计算资源和服务从本地设备转移到云端的创新方式。通过云电脑,只需要一个稳定的网络连接,你就能通过笔记本、平板甚至手机等移动设备访问云端上的个人桌面、调用各种数据和应用。云电脑的主要应用场景包括:游戏娱乐、企业办公、科学研......
  • 【金融资产组合模型进化论】4.1 对MPT+Fama-French五因子优化方案实现Backtrader量化
    目录0.承前1.汇总代码2.近4年量化回测2.1获取近4年资产组合数据2.2对近4年资产组合数据进行量化回测3.启后3.1待优化点0.承前本篇博文是对文章,链接:【金融资产组合模型进化论】4.马科维茨资产组合模型+Fama-French五因子优化方案(理论+Python实战)实现量......
  • 基于微信小程序的蛋糕订购平台设计与实现
    ......
  • 【LeetCode】力扣刷题热题100道(31-35题)附源码 搜索二维矩阵 岛屿数量 腐烂的橙子 课程
    一、搜索二维矩阵编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。可以使用从右上角开始搜索的方法来有效地找到目标值。选择起始位置:从矩阵的右上角开始。......
  • 【华为OD-E卷 - 最大花费金额 100分(python、java、c++、js、c)】
    【华为OD-E卷-最大花费金额100分(python、java、c++、js、c)】题目双十一众多商品进行打折销售,小明想购买自己心仪的一些物品,但由于受购买资金限制,所以他决定从众多心仪商品中购买三件,而且想尽可能的花完资金。现在请你设计一个程序帮助小明计算尽可能花费的最大资金数......
  • 【华为OD-E卷 - 一种字符串压缩表示的解压 100分(python、java、c++、js、c)】
    【华为OD-E卷-一种字符串压缩表示的解压100分(python、java、c++、js、c)】题目有一种简易压缩算法:针对全部由小写英文字母组成的字符串,将其中连续超过两个相同字母的部分压缩为连续个数加该字母,其他部分保持原样不变。例如:字符串“aaabbccccd”经过压缩成为字符串“3ab......
  • 01背包的推导
    1.二维背包容量为7,总共有四件物品,价值和重量表示为{v,w},它们的价值和重量分别是1{2,3},2{5,5},3{1,1},4{9,3},求背包最多能装多少开始推导:能装i个物品并选取前i个物品,背包容量为j。dp[1][1]=0,显然是0,因为物品1的重量为3,你装答辩啊。dp[1][2]=0,容量不够还是不行。dp[1][3]=2,背包的容......