浅谈H264数据的分析

日期:2014-08-04点击次数:8660

       在视频监控的项目中,要想预览到清晰流畅的视频画面,对于视频数据的传输及显示就是我们要关注的重点。随着现在对画质的要求越来越高,从前端采集出来的数据码流就相应的越来越大,直接传输采集的数据,无疑会给网络传输带来很大的负担,对于一个200W的摄像头,可能每秒的码流达到几M,所以在传输之前采用压缩算法将采集的数据进行压缩后再输出,但是即使是压缩后的数据,也可能会达到M的单位数量级,于是,大多数的设备厂商就采用了将数据进一步封装来传输。封装的时候一般都是采用标准的编码格式来进行封装,常见的编码格式有MPEG4,H.264,H.265等,我们通过依据标准的编码来对应的分析出我们想要的数据。接下来就以最近项目上对海康的视频数据经验来进行简单的介绍。
       目前我们项目上使用的有海康的IPC和DVR,当我们利用SDK拿到回调出来的数据后,只能知道是混合数据流,但是却无法知道这一包数据是音频还是视频,是I帧P帧B帧,时间戳又是什么。要想得到这些数据,我们就得按照标准H.264的编码格式来进行解析。
       首先IPC和DVR回调出来的第一包数据是固定长度的40个字节的系统头,供后续的解码使用,不过IPC的系统头和DVR的还不一样,IPC的系统头:0x49 4D 4B 48 01 01 00 00 02 00 00 01 10 71 01 10 40 1F 00 00 00 FA 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00,DVR的系统头:0x49 4D 4B 48 01 01 00 00 02 00 00 01 21 72 01 10 80 3E 00 00 80 3E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00。
       紧接着后面的就是视频数据,从对海康的数据包的分析得知,回调出来的最长的包的为5120个字节,最短的包为20个字节。接下来对码流的数据进行具体的分析,H264的码流结构图如下:
 
1.H264的编码视频序列包括一系列的NAL单元:
NAL单元=一个字节的头+一个包含可变长编码符号的字符串

1

2

3

4

5

6

7

8

T

R

F

T:是NALU的类型,即负荷数据的类型,一共有32种类型
R:重要性指示位,用于在重构过程中标记一个NAL单元的重要性
F:禁止位
2. 当NALU对应的Slice为一帧的开始,即为0x00 00 01 BA,一般每帧的第一包的长度为20个字节,如:0x00 00 01 BA 4D CE 6D E0 F4 01 00 00 03 FE FF FF 00 00 00 01,在这20个字节中可以分析出帧的序列号,这一包的后几位就是帧的序列号,此包的序列号为01,表示是第一个帧。
3.一般回调出来的第一帧都是I帧,在I帧中会有SPS和PPS,0x00 00 01 BC开头的,表示系统头,后面紧接着的两位来记录后面的负载长度,如:0x00 00 01 BC 00 5A E0 FF 00 24 40 0E 48 4B 00 01 0E 66 AD 08 60 07 FF FF FF FF 41 12 48 4B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2C 1B E0 00 10 42 0E 00 00 A0 21 06 40 04 B0 12 1F FF 00 3A 99 91 C0 00 0C 43 0A 00 00 FE 00 7D 03 03 E8 03 FF BD BD 00 00 BF BF 00 00 00 00 00 00,其中0x00 5A记录的就是后面的负载长度。
4.接下来的就是PES包:0x00 00 01 E0+两字节(记录负载的长度)+负载,在PES的负载数据中可以分析出帧类型,如:0x00 00 01 E0 00 22 8C 80 07 23 73 9B 78 3D FF FC 00 00 00 01 67 42 80 29 88 8B 40 32 01 2F 42 00 00 1D 4C 00 02 BF 20 08 00 00 01 E0 00 0E 8C 00 03 FF FF FC 00 00 00 01 68 CE 38 80,该包的负载长度为0x00 22,在负载中0x00 00 00 01 67的最后五位为00101,即type=5,可以说明该帧的类型为IDR。
5.由于回调出来的数据是混合流,除了视频数据外,还有音频,一般音频包是以0x00 00 01 C0+两字节(记录负载长度)+负载数据。
6.除此之外从数据中还可以分析出pts(显示时间戳),dts(解码时间戳),对于从视频中分析出来的时间戳,并不是采集当时的时间点,所以并不能按照我们换算时间的方法去解析时间。这个时间戳就是采集数据时添加的一个序列号,用于播放的同步的。
       有时候单独利用一包的数据,可能分析不出来这包的信息,就需要利用几包的数据来一起分析。
       关于H264数据的分析,还有很多要研究的地方,可以参考H.264官方的文档进行学习。


 

研发部   陈娟

上一篇:OPC简介下一篇:优化程序
姓名:
性别:
电话:
E-mail
问题:
问题描述:
版权所有 金名计算机系统集成股份有限公司 备案号:京ICP备13027063号