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

news/2025/1/17 12:50:09/文章来源:https://www.cnblogs.com/CrescentWind/p/18676730

视频帧

对于一份视频,实质上是多张图片高速播放形成的。每一张图片即为该视频的一帧。而每秒钟播放的图片张数便为所谓的帧率(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帧的个数以及排列都有可能是不一样的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/870739.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Issac Gym出现error: subprocess-exited-with-error报错

1. 前言 一方面便于日后自己的温故学习,另一方面也便于大家的学习和交流。 如有不对之处,欢迎评论区指出错误,你我共同进步学习! 2. 正文 我在安装humanoid gym pip install -e .的时候,出现下列问题:解决方法: pip install --upgrade setuptools没解决就先卸载setupt…

高版本Jenkins关闭跨站请求伪造保护(Debian系)

关闭方法: 修改配置文件:/etc/default/jenkins(Debian系默认位置) 找到函数JAVA_ARGS,加上-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true这段,重启Jenkins。

【分享】 100+ 套开源大数据可视化大屏Html5模板,全网最炫!

************************************************* 博客园:http://www.cnblogs.com/kingboy2008/ 今日头条:https://www.toutiao.com/c/user/token/MS4wLjABAAAAlK12eJwVSGYna9n7enGhiqQA_r386diukZRcWQulCRc/? CSDN:http://hi.csdn.net/kingboy2008 *******************…

直接把浏览器中的url知道复制到postman中

直接把浏览器中的url知道复制到postman中 1.找到需要复制的接口 2.右击接口 3.点击copy 4.选择cURL(bash)遇见问题,这是你成长的机会,如果你能够解决,这就是收获。 作者:晚来南风晚相识 出处:https://www.cnblogs.com/IwishIcould/ 想问问题,打赏了卑微的博主,求求你备…

LSTM缓解梯度消失

LSTM缓解梯度消失 Bilibili【重温经典】大白话讲解LSTM长短期记忆网络 如何缓解梯度消失,手把手公式推导反向传播 前向传播结构及原理 以“期末考试周”为例理解回顾RNN的梯度消失原因反向传播:LSTM如何缓解梯度消失

云原生K8Sconfing泄露etcdproxy

一、Etcd未授权访问 攻击port:2379;默认通过证书认证,主要存放节点的数据,如一些token证书。第一种情况: 没有配置--client-cert-path参数打开证书验证(或者改为false),暴露外Etcd服务存在未授权访问风险; 暴露外部可以访问,直接未授权访问获取secrets和token利用; 第…

2024年微信公众号收到赞赏6487.50

等了好久的微信公众号2024年创作回顾终于推送了,这是一个针对微信公众号创作的年终总结,如果没有记错的话应该是微信公众号推送年终总结的第二年。2023年的完整总结数据在这里:「我的2023年公众号创作数据分享」,在这份总结里我发现了许多有趣的数据,例如2023年全年一共发…

rpm安装clickhouse(24.11.8.5单机)

环境:OS:Centos 7db:24.11.8.5 1.下载安装介质下载地址为:https://packagecloud.io/Altinity/clickhouse或是这里下载https://mirrors.tuna.tsinghua.edu.cn/clickhouse/rpm/stable/x86_64/ 我这里下载的是如下三个包clickhouse-client-24.8.11.5.noarch.rpmclickhouse-common-…

不知道怎么坏的,但是修好了。修一个吉他数字效果器!

本文介绍了ZOOM G1 Four数字效果器不开机故障的分析和排除。涉及到上电时序的分析。孤独摇滚看上头 吉他梦碎效果器 两年前看孤独摇滚上头入手了电吉他。家贫,配的是海鲜市场买的ZOOM G1 Four数字效果器。这里简单介绍一下他的供电方案,有4节1.5V干电池,9V内负外正的DC插座,…

VUE反向代理怎么配置?如何防止本地开发时接口调用跨域问题?

在vue开发中,经常会遇到跨域问题。那么比较常见的前端处理方法就是配置反向代理,如何配置呢? 1.前往根目录,创建vue.config.js文件; 2.编写配置:1 const path = require(path);2 // const ZipPlugin = require(zip-webpack-plugin);3 let zipName = dist;4 module.export…

【ABKing】记一次Python SSTI的内存马技术研究

通过对Python SSTI的技术研究,发现网上的一些Payload具有局限性,并非能直接使用,踩了一些坑,写出了自己的独创Payload 0x00 起因 有个用户单位反馈,HW期间被攻击队打了个RCE,并且提供了攻击队的报告和防火墙的流量。正好临近年关,闲来无事,想到已经很久没有认真钻研技术…