序言
关于1078实时监控的另一种做法,就是自己编码处理音视频裸流.这种形式需要了解更多的音视频基础知识,因为之前的处理过程是JavaCV帮我们做了很多东西.本文只是做个准备工作,先了解一些基础知识在,然后才能知道该方案的可行性
参考资料:
- https://blog.csdn.net/u013008311/article/details/80249586
- https://blog.csdn.net/u013008311/article/details/80251479
- https://blog.csdn.net/jefry_xdz/article/details/8461343
- https://www.cnblogs.com/wainiwann/p/7477794.html
H264/AVC
视频编解码技术有两套标准:
- 国际电联(ITU-T)的标准H.263、H.263+等;
- ISO 的MPEG标准Mpeg1、Mpeg2、Mpeg4等等。
H.264/AVC是两大组织集合H.263+和Mpeg4的优点联合推出的最新标准,最具价值的部分无疑是更高的数据压缩比。在同等的图像质量条件下,H.264的数据压缩比能比H.263高2倍,比MPEG-4高1.5倍。 所以说H264和AVC 其实是指同一个东西.
H.264/AVC标准是由ITU-T和ISO/IEC联合开发的,定位于覆盖整个视频应用领域,包括:低码率的无线应用、标准清晰度和高清晰度的电视广播应用、Internet上的视频流应用,传输高清晰度的DVD视频以及应用于数码相机的高质量视频应用等等。
ITU-T给这个标准命名为H.264(以前叫做H.26L),而ISO/IEC称它为MPEG-4 高级视频编码(Advanced Video Coding,AVC),并且它将成为MPEG-4标准的第10部分。既然AVC是当前MPEG-4标准的拓展,那么它必然将受益于MPEG-4开发良好的基础结构(比如系统分层和音频等)。很明显,作为MPEG-4高级简洁框架(Advanced Simple Profile,ASP)的MPEG-4 AVC将会优于当前的MPEG-4视频压缩标准,它将主要应用在具有高压缩率和分层次质量需求的方向。
H264原始码流是一个接一个的NALU(网络抽象层单元)租成的,每个单元之间是由 0x00 0x00 0x00 0x01 或者 0x00 0x00 0x01分割而成的,紧接着就是NALU的单元头和数据体.(注意这里的NALU是很重要的,因为后面我会一定要现货区NALU才能进行编码操作与封装操作.--cuiyaonan2000@163.com,注意这里的分隔符~~很重要,我们在收到终端的推流数据的时候就会遇到)
NAL
在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:
- 视频编码层面(VCL):负责有效表示视频数据的内容
- 网络抽象层面(NAL):负责格式化数据并提供头信息,保证数据适合各种信道和存储介质上的传输(这个是我们要关注的重点)
因此我们平时的每帧数据就是一个NAL单元(SPS与PPS除外)。在实际的H264数据帧中,往往帧前面带有00 00 00 01 或 00 00 01分隔符,一般来说编码器编出的首帧数据为PPS与SPS,接着为I帧…… 注意这里的分隔符.cuiyoanan2000@163.com
SPS(参数集合)
SPS即Sequence Paramater Set,又称作序列参数集。SPS中保存了一组编码视频序列(Coded video sequence)的全局参数。所谓的编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集中。一般情况SPS和PPS的NAL Unit通常位于整个码流的起始位置。但在某些特殊情况下,在码流中间也可能出现这两种结构,主要原因可能为:(这个特殊情况不考虑)
- 解码器需要在码流中间开始解码;
- 编码器在编码的过程中改变了码流的参数(如图像分辨率等)
PPS(参数集合)
除了序列参数集SPS之外,H.264中另一重要的参数集合为图像参数集Picture Paramater Set(PPS)。通常情况下,PPS类似于SPS,在H.264的裸码流中单独保存在一个NAL Unit中,只是PPS NAL Unit的nal_unit_type值为8;而在封装格式中,PPS通常与SPS一起,保存在视频文件的文件头中。(这个是我们的1078的环境,不考虑真实环境)
解析H264数据
最上面图的码流对应的数据来层层分析,以00 00 00 01分割之后的下一个字节就是NALU类型,将其转为二进制数据后,解读顺序为从左往右算,如下:
- 第1位禁止位,值为1表示语法出错
- 第2~3位为参考级别
- 第4~8为是nal单元类型(单元类型如下图所示)
例如上面00000001后有67,68以及65
其中0x67的二进制码为:
0110 0111
4-8为00111,转为十进制7,参考第二幅图:7对应序列参数集SPS
其中0x68的二进制码为:
0110 1000
4-8为01000,转为十进制8,参考第二幅图:8对应图像参数集PPS
其中0x65的二进制码为:
0110 0101
4-8为00101,转为十进制5,参考第二幅图:5对应IDR图像中的片(I帧)
所以判断是否为I帧的算法为: (NALU类型 & 0001 1111) = 5 即 NALU类型 & 31 = 5
--------------------------------------------------未完待续----------------------------------------
来源:oschina
链接:https://my.oschina.net/u/4301161/blog/4277075