本文主要是介绍视音频基础知识——I,P,B,PTS,DTS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一:I帧,P帧和B帧
I frame :帧内编码帧 又称intra picture,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是一个图像经过压缩后的产物。自身可以通过视频解压算法解压成一张单独的完整的图片。P frame: 前向预测编码帧 又称predictive-frame,通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧;需要参考其前面的一个I frame 或者B frame来生成一张完整的图片。
B frame: 双向预测内插编码帧 又称bi-directional interpolated prediction frame,既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧;则要参考其前一个I或者P帧及其后面的一个P帧来生成一张完整的图片。
PTS:Presentation Time Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来
DTS:Decode Time Stamp。DTS主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码。
在没有B帧存在的情况下DTS的顺序和PTS的顺序应该是一样的。两个I frame之间形成一个GOP,在x264中同时可以通过参数来设定bf的大小,即:I 和p或者两个P之间B的数量。
简言之:视频编码目的是为了缩小数据量,为了达到这个目的,设置了P帧。P帧不存储原图像数据,存储的是与前一帧的区别,这样就可以大大减小存储空间。为了进一步减小存储空间,设置了B帧,B帧存储的是和前帧与后帧(I帧或P帧)的区别。
二:PTS 和 DTS
不含B帧:对于不含B帧的图像序列,例如 :
图像序列:IPPIPP...
显示时候一般按正常顺序显示:IPPIPP... —— 即 PTS。
解码时候,由于P帧需要依赖前帧,因此解码顺序也为:IPPIPP... —— 即DTS。
所以说对于不含B帧的序列,PTS 和 DTS 顺序应该是一样的。
包含B帧:对于包含B帧的序列,由于B帧需要依赖后帧,因此当解码B帧时需要先将B帧缓存起来,当B帧的后帧(非B帧)解码之后再解码之前缓存的B帧。一般而言,图像序列顺序即显示顺序(PTS),而包含B帧的序列解码时候导致序列发生了变化(DTS),因此一般PTS与DTS不同。举例说明:
GOP = 15.
三:视频时间戳 和 音频时间戳
视频 PTS:
当视频帧率为 N (fps) 时候,时间基为:1000 / N (ms) 。则第 M 帧开始的时间为 :(M-1)*(1000/N) (ms) ,即PTS。
音频 PTS:
当音频采样率为 N (Hz)时候,时间基为1000/N (ms) ,设每帧有K个采样点,则第M帧开始的时间为:(M-1)*(K*1000/N) (ms),即PTS。(此处有疑问?)
这篇关于视音频基础知识——I,P,B,PTS,DTS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!