- 视频的I B P帧
1.I-frame的缩写,即关键帧。关键帧是构成一个帧组(GOP,Group of Picture)的第一个帧。IF保留了一个场景的所有信息。压缩比为1:7。
2.P-frame的缩写,即未来单项预测帧,只储存与之前一个已解压画面的差值。压缩比为1:20。
3.B-frame的缩写,即双向预测帧,除了参考之前解压过了的画面外,亦会参考后面一帧中的画面信息。压缩比为1:50。 - 视频的pts dts
PTS:Presentation-Time-Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来。
DTS:Decode-Time-Stamp。DTS主要是标识读入内存中的比特流在什么时候开始送入解码器中进行解码。
让我们来看下编码,存储以及解码,显示的具体步骤:
假设从摄像头采集,采集顺序 1 2 3 4 5 ,最终编码结果是:1编码成I帧,2,3,4编码成B帧,5编码成P帧。
视频帧采集后,经过编码器encode以及mux成容器格式,编码和存储过程如下:
编码:
1)先编码 1,编成I帧
2)2,3,4准备编码成b帧,先缓存下来,记录下采集的时间点,后续作为pts基准
3)再编码 5,编成P帧,(注意5虽然先编码,dts相对2,3,4靠前,但是它的采集时间比2,3,4要晚,所以pts大于2,3,4)
4)编码 2, 3, 4 ,编成B帧
编码后立即经过mux写文件,所以存储顺序和编码顺序是一致的,编码后的顺序为(dts顺序)
1 5 2 3 4
I P B B B
视频保存下来后,如果通过player播放,需要解码和渲染,解码和显示的过程如下:
解码:(按照dts顺序)
1 5(参考1) 2(参考1,5) 3(参考1,5) 4(参考1,5)
解码后重新排序(按照pts),显示
1 2 3 4 5 - H264
H264协议分析
在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(NAL)Network Abstract Layer。其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。因此我们平时的每帧数据就是一个NAL单元(SPS与PPS除外)。在实际的H264数据帧中,往往帧前面带有00 00 00 01 或 00 00 01分隔符,一般来说编码器编出的首帧数据为PPS与SPS,接着为I帧(1pps 2 sps 3i/idr)。H264是一种常见视频编码格式,在很多视频格式中我们都可以用到(JT1078中设备上传的视频格式也以H264居多)
00 00 00 01分割之后的下一个字节就是NALU类型,将其转为二进制数据后,解读顺序为从左往右算,如下:
(1)第1位禁止位,值为1表示语法出错
(2)第2~3位为参考级别
(3)第4~8为是nal单元类型
- SPS PPS
SPS即Sequence Paramater Set,又称作序列参数集。SPS中保存了一组编码视频序列(Coded video sequence)的全局参数,所谓的编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集中包含某种条件下的最大视频分辨率、最大视频帧率等参数 ,参考帧的最大数目,图形的宽和高等。
PPS即Picture Paramater Set图像参数集
- FLV
FLV(Flash Video)是一种流媒体格式,因其体积小、协议相对简单,很快便流行开来,并得到广泛的支持。
FLV 由 FLV header 跟 FLV file body 两部分组成,而 FLV file body 又由多个 FLV tag组成。
1.FLV tag又分为3种类型:
Video Tag:存放视频相关数据;
Audio Tag:存放音频相关数据;
Script Tag:存放音视频元数据;
2.FLV header由如下字段组成,其中:
前三个字节内容固定是FLV
最后4个字节内容固定是9(对FLV版本1来说)
字段 | 字段类型 | 字段含义 |
Signature | UI8 | 签名,固定为'F' (0x46) |
Signature | UI8 | 签名,固定为'L' (0x4c) |
Signature | UI8 | 签名,固定为'V' (0x56) |
Version | UI8 | 版本,比如 0x01 表示 FLV 版本 1 |
TypeFlagsReserved | UB[5] | 全为0 |
TypeFlagsAudio | UB[1] | 1表示有audio tag,0表示没有 |
TypeFlagsReserved | UB[1] | 全为0 |
TypeFlagsVideo | UB[1] | 1表示有video tag,0表示没有 |
DataOffset | UI32 | FLV header的大小,单位是字节 |
3.FLV file body
flv file body很有规律,由一系列的TagSize和Tag组成,其中:
PreviousTagSize0 总是为0;
详细内容参考 video_file_format_spec_v10.pdf的第4页起内容。
- 其他
该部分flv知识参考了博客(https://www.cnblogs.com/chyingp/p/flv-getting-started.html)
video_file_format_spec_v10.pdf文档
https://www.adobe.com/content/dam/acom/en/devnet/flv/video_file_format_spec_v10.pdf