网络摄像机RTSP流媒体协议视频平台EasyNVR如何根据H264的SPS获取视频分辨率?

H264 ES流中的sps nalu中可以提取出视频宽度和高度的信息,有时可以得到固定帧率的信息,而对于变帧率的视频有时候得不到帧率信息,需要根据时间戳来呈现。RTSP协议视频平台EasyNVR在拉取视摄像机视频流的时候,如果摄像机在取流以后改变分辨率,EasyNVR获取的分辨率没有改变,就会导致播放异常。

网络摄像机RTSP流媒体协议视频平台EasyNVR如何根据H264的SPS获取视频分辨率?_第1张图片

所以我们可以根据H264的SPS实时获取视频分辨率,通过wireshark 抓取到H264的SPS如下:

网络摄像机RTSP流媒体协议视频平台EasyNVR如何根据H264的SPS获取视频分辨率?_第2张图片

根据H264的文档说明,可以通过SPS中的不同字段计算出当前视频的分辨率。宽高可从SPS字段计算得到,公式如下:

Width = (pic_width_in_mbs_minus1+1)16;
Height = (pic_height_in_map_units_minus1+1)16;

Width = (39+1)* 16 = 640
Height = (22+1) * 16 = 368

根据此公式获取到的分辨率是 640368,但是实际上摄像头的设置分辨率是640360。在高度上,计算出的结果存在误差。

所以以上计算是针对宽高是16的整数倍的情况下,如果不是,则需要进行修正,修正公式如下:

Width = ((pic_width_in_mbs_minus1 +1)*16) - (frame_crop_left_offset+frame_crop_right_offset)*2

Height = ((2 - frame_mbs_only_flag)* (pic_height_in_map_units_minus1 +1) * 16) - (frame_crop_top_offset + frame_crop_bottom_offset)* 2;

Width = (39+1)*16 - (0+0)*2 = 640
Height = (2-1)*(22+1)*16-(0+4)*2 = 23*16 -8 = 360

获取分辨率为640*360 与摄像头一致,分辨率的问题解决了,视频播放的问题也将迎刃而解。

EasyNVR可以输出四种格式的视频流,分别是RTSP/RTMP/HLS/FLV,经过我们的测试,RTMP视频流是目前延迟最小的视频流,在不受网络带宽和服务器配置影响下,理论延时最小只有500ms。如若想了解更多内容,欢迎访问TSINGSEE青犀视频,也可以随时咨询我们获取测试账号进行测试。

 

EasyDarwin开源流媒体服务器,是由国内开源流媒体团队TSINGSEE青犀视频开发和维护的一款开源流媒体平台框架。从2012年12月创建并发展至今,从原有的单服务的流媒体服务器形式,扩展成现在的云平台架构的开源项目。

你可能感兴趣的:(EasyNVR特性,EasyDarwin,TSINGSEE青犀视频,流媒体服务器)