视频软件基本流程
1.什么是H264
H.264是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准
H265又名高效率视讯编码(High Efficiency Video Coding, HEVC)编码格式,支持1080p以上的4K×2K和8K×4K分辨率,将视频压缩率提高至H.264的约2倍。相比H.264,H.265需要更高的计算资源来进行编码和解码。由于H.265的算法更复杂,对处理器性能的要求更高。这意味着在相同的硬件条件下,H.265的编码和解码速度可能较慢。
2.H.264的数据格式是怎样的?
H.264由视频编码层(VCL)和网络适配层(NAL)组成。
◆ VCL:H264编码/压缩的核心,主要负责将视频数据编码/压缩,再切分。视频编码层,包括核心压缩引擎和块、宏块和片的语法级别定义,设计目标是尽可能地独立于网络进行高效的编码,负责有效表示视频数据的内容。
◆ NALU = NALU header + NALU payload,负责将 VCL 产生的比特字符串适配到各种各样的网络和多元环境中,覆盖了所有片级以上的语法级别;一个NALU 单元常由 [NALU Header] + [NALU Payload] 部分组成。
3.VCL是如何管理H264视频数据?
◆ 压缩:预测(帧内预测和帧间预测)-> DCT变化和量化 -> 比特流编码;
◆ 切分数据,主要为了第三步。"切片(slice)"、“宏块(macroblock)"是在VCL中的概念,一方面提高编码效率和降低误码率、另一方面提高网络传输的灵活性。
◆ 包装成『NAL』。
◆ 『VCL』最后会被包装成『NAL』
4.NAL头的数据结构体
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
F | NRI | TYPE |
◆ F(forbidden_zero_bit):1 位,初始为0。当网络识别此单元存在比特错误时,可将其设为 1,以便接收方丢掉该单元
◆ NRI(nal_ref_idc):2 位,用来指示该NALU 的重要性等级。值越大,表示当前NALU越重要。具体大于0 时取何值,没有明确规定
◆ Type(nal_unit_type):5 位,指出NALU 的类型,如下所示:
5.H.264码流结构
◆ H.264 = start_code + NALU(start_code:00000001 or 000001)
◆ 每个NAL前有一个起始码 0x00 00 01(或者0x00 00 00 01),解码器检测每个起始码,作为一个NAL的起始标识,当检测到下一个起始码时,当前NAL结束。
◆ 同时H.264规定,当检测到0x000000时,也可以表征当前NAL的结束。那么NAL中数据出现0x000001或0x000000时怎么办?H.264引入了防止竞争机制,如果编码器检测到NAL数据存在0x000001或0x000000时,编码器会在最后个字节前插入一个新的字节0x03,这样:
0x000000->0x00000300
0x000001->0x00000301
0x000002->0x00000302
0x000003->0x00000303
EBSP等同于NAL Body的数据本身,它包含了原始编码数据(RBSP)以及一个特殊的字节0x03,这个字节被称为防止竞争校验字节。它的目的是为了防止NAL Body内部出现与NAL Unit起始码冲突的字节序列
实例分析H246解码:
如下图其实位没问题是00000001,然后27(0010 0111),其中00说明没有错误,10是等级0111是NAL的类型,根据上表查找可以知道是序列参数集。
6.I帧、P帧和B帧
提到H.264,不得不提I帧、P帧、B帧、IDR帧、GOP。
◆ I帧(Intra-coded picture,帧内编码图像帧),表示关键帧,采用类似JPEG压缩的DCT(Discrete Cosine Transform,离散余弦变换)压缩技术,可达1/6压缩比而无明显压缩痕迹;
◆ P帧(Predictive-coded picture,前向预测编码图像帧),表示的是跟之前的一个关键帧或P帧的差别,P帧是参考帧,它可能造成解码错误的扩散;
◆ B帧(Bidirectionally predicted picture,双向预测编码图像帧),本帧与前后帧(I或P帧)的差别,B帧压缩率高,但解码耗费CPU;
◆ IDR帧(Instantaneous Decoding Refresh,即时解码刷新):首个I帧,是立刻刷新,使错误不致传播,IDR导致DPB(DecodedPictureBuffer参考帧列表——这是关键所在)清空;在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧的内容;IDR具有随机访问的能力,播放器可以从一个IDR帧播放。
◆ GOP(Group Of Picture,图像序列):两个I帧之间是一个图像序列,一个GOP包含一个I帧
7.解码时间戳和显示时间戳
当然,H.264中还有两个重要的概念:DTS和PTS
◆ DTS(Decoding Time Stamp,解码时间戳解):读入内存中的比特流在什么时候开始送入解码器中进行解码
◆ PTS(Presentation Time Stamp,显示时间戳):解码后的视频帧什么时候被显示出来
如上这段解码顺序首先是I帧,然后是B,因为B帧是双向所以,发现第三个也是B帧就会缓存到解码内存中,所以解码缓存,然后第3和第4,然后最后才是第2,之后以此类推。