1、VCL只关心编码部分,重点在于编码算法以及在特定硬件平台的实现
(1)SODB 是VCL输出的是编码后的纯视频流信息,没有任何冗余头信息
2、NAL关心的是VCL的输出纯视频流如何被表达和封包以利于网络传输,
(1)RBSP 是通过SODB封装成nal_unit格式得到的,Nal_unit是一个通用封装格式,可以适用于有序字节流方式和IP包交换方式
具体封装流程:https://blog.csdn.net/d_l_u_f/article/details/7260772
(2)NALU 是针对不同的传送网络(电路交换|包交换),将RBSP 封装成针对不同网络的封装格式(加上NAL header)
3、之间关系:
SODB + RBSP trailing bits = RBSP
NAL header(1 byte) + RBSP = NALU
RTP封装格式(12个字节) + NALU = 最后sendto出去的完整包
RBSP就是H.264编码后出来的裸流文件,给文件加上后缀.h264,得到xxx.h264
(1) 一段h.264的码流其实就是多个sequence组成的
(2)一个sequence是一秒,如果FPS等于30,就有30帧图像(I/P/B帧)
(3)每个sequence均有固定结构单元:1sps+1pps+1sei+1I帧+若干p帧(加上B帧一共有6种单元情况)
(1) H.264在编码的时候,生成一个序列时,序列中每个单元前面就会加上00 00 00 01作为分隔符
(1)分隔符后面紧跟着的第一个字节就是用来判断是什么类型的单元
1、第1位禁止位,值为1表示语法出错
2、第2~3位为参考级别
3、第4~8为是nal单元类型nal_unit_type(比如是0x67(取5位00111表示sps)
播放器算法解码时,就知道这个字节开始到下一个分隔符之间的数据按照sps类型解析数据
(1)序列参数集。SPS中保存了一组编码视频序列(Coded video sequence)的全局参数,所谓的编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集中
(2)里面包含宏块编码方式、图像大小尺寸、宏块个数,播放器通过这些参数,调用播放器里面的对应算法去解码
(3)具体意义参考博客:https://www.cnblogs.com/wainiwann/p/7477794.html
(1)H.264中另一重要的参数集合为图像参数集Picture Paramater Set(PPS),具体位意义参考博客
(1)也是一些图像的额外信息,帮助播放器解析压缩图像
(1)I帧是关键,丢了I帧当前sequence就废了,每个sequence有且只有1个I帧
(2)帧内编码帧 ,I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面),I帧大,说明本身压缩比不高,图像数据更完整,则P帧可以越小,反之I帧越小则P帧会越大
(3)P帧:前向预测编码帧。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)
(4)B帧:双向预测内插编码帧。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别
具体特点参考:https://www.cnblogs.com/cy568searchx/p/6125031.html
(1)一个sequence有30个帧,每个帧就是1/30秒,压缩后的字节数不一样,2000到10000+不等,主要看图像动作是否很大
(2)CBR就是牺牲图像清晰度,保证每帧图像字节数变化不会很大,这样码率就能均衡,网络传输也能稳定
(3)VBR就是牺牲码率,动作变化大的时候,参考VBR,帧数据会很大,保证清晰度,不管码率是否稳定,这样在网络传输的时候,网络带宽有限,带宽给的宽,资源限制,给的小,大的帧传输不完,比如I帧,网络就会不稳定
(1)时间戳
https://blog.csdn.net/wxl1986622/article/details/52758022