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


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

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

    根据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月创建并发展至今,从原有的单服务的流媒体服务器形式,扩展成现在的云平台架构的开源项目。

     
  • 相关阅读:
    【5】Python之nnlog写日志模块,yagmail发送邮件模块
    【11】Python面向对象:封装和继承(类、函数/方法、重写)
    【5】Java继承
    【4】作业:办公信息化管理系统
    【3】综合案例:学生信息管理
    【2】Java封装
    【1】java面向对象
    【9】综合案例:数组移位与统计
    【8】Java方法
    【7】Java数组之二维数组
  • 原文地址:https://www.cnblogs.com/EasyNVR/p/13712562.html
Copyright © 2020-2023  润新知