前文 《简单解析海康PS流获取H264》 针对海康摄像头的PS流解析做了简单处理,基本逻辑是正确的,但最近几个摄像头出现了一些奇怪的问题,需要针对相关现象进行查询。

RTP传输层

项目中为了可靠处理且因其他原因使用了TCP来传输28181的RTP数据,根据 rfc4571 记录,使用TCP传输的时候只需要在RTP包之前打上2个字节的长度,用来控制,毕竟TCP是流式传输,只能靠长度字段进行包的区分。

因此使用了TCP方式的RTP看起来问题不大,简单处理下就可以提取出PS数据了,事实也基本如此。但是出问题的摄像头却经常在解析RTP的时候出错,即判断RTP标志和SSRC出错,证明不是RTP包或者说包错乱。经过调试,打印出RTP头的所有信息,确实是在某个包后就出错了。打开二进制进行查看,发现出错之后往后部分数据之后,还能发现新的RTP包,看来是丢数据了。

将抓包数据写个测试程序测试,测试程序在解析RTP出错之后,往后查新的RTP包(主要靠SSRC),然后打印每个包的时间戳和序列号,发现确实是中间丢了几个包,TCP还能丢包?再看看日志发现,出现问题的摄像头都是上传速度非常慢的摄像头,即每秒仅能上传几帧视频的,而且丢包丢的都是I帧,毕竟I帧非常大。

因此猜测摄像头本身逻辑可能有点问题,即内部编码数据后,可能累积了大量未发送的数据,然后进行了内部丢包,而且这个丢包应该并没有按照一个RTP包去丢,而是直接丢弃的缓存数据,因而造成了上述问题。当然这只是根据现象的猜测,至于具体嘛,咱也不知道,咱也没有问。

还有一个现象是,这种丢包发生一会之后网络连接就被摄像头给断了。因为暂时不确定其他推流速度正常的摄像头是否会偶发这种现象,因此暂时任务可能偶发,针对性的类似测试程序一样,出现问题了通过查找下一个包来缓解挽救。但这由于丢包肯定会导致解析媒体数据出现错误,也就是下面的问题。

PS解析的错误处理

网络丢包造成的无法解析

如上,在丢包后,肯定会造成数据无法解析,这个时候肯定不能再继续处理了,肯定要结束当前的解析状态。也就是要上面网络层的配合,即网络层发现丢包之后要反馈给PS解析,让PS解析器及时的停止和重置,具体说来,大概是如果当前已经解析了一些媒体数据了,则提交这些数据,等待下一个PS包的到来(0x000001ba)。

PS数据格式错误?

在没有丢包的情况下,在解析PS的时候依然出现了问题,其格式大概如下

如上 0x000372F0 偏移处是前一个PES包(大小65478),里面解析了一个I帧0x000372FC,然后下一个PES包是 0x0004C72C 偏移处。二者偏移远远超过了 0xFFFF 大小,而PES的大小就是两个字节表示的。那么这就意味着格式有误,同时在RTP层解析确认此处的RTP流是顺序的,是没有丢包发生的。

虽然这个软件能解析出来后续的,但确实是对不上格式定义的,那这个也是一个坑。这个地方我也打算同上处理,解析的时候发生错误时候,查找下一个 0x000001XX 即可。同时也会兼顾RTP层的包及新的PS包 0x000001BA 出现。

其他问题

PS中媒体的真正时间戳

一般一个PS中存在了一个时间戳的视频包和一个时间戳的音频包,但是这个音频包和视频包可能时间戳是不相同的,为了表示准确,解析的时候尽量是按照时间戳变化后提交一次数据,无论是音频还是视频,基本上时间戳就没问题了。

java ps h264_从海康28181的PS流解析H264的补充相关推荐

  1. 对海康28181摄像头PS流解码的支持(一)

    背景 我们的项目是基于sip的IMS系统,需要添加对海康28181摄像头的支持,所以分为以下几步: 向海康摄像头发起点播请求,基于sip. PS流过来后,剥出h264流. 对h264流进行解码. 一. ...

  2. 海康sdk捕获码流数据通过JavaCV推成rtmp流的实现思路(PS流转封装RTMP)

    海康sdk捕获码流数据通过JavaCV推成rtmp流的实现思路(PS流转封装RTMP) 问题分析 转码推rtmp PS流转封装 码云(Gitee)主页:https://gitee.com/banmaj ...

  3. java GB28181 大华 海康摄像机国标对接源码源代码程序

    java GB28181 大华 海康摄像机国标对接源码源代码程序 本人亲测说明:首先此套程序我测试了可以用,但是不能同时多客户同时看一路视频,视频打开速度也很慢.仅拿来参考是可以的,还凑合吧. WEB ...

  4. Gb28181之Ps流解析H264

    gb28181发送码流选择PS流,PS流在封装H264的数据.本文详细描述如何通过ps流解析H264码流. *************************PSM流解析*************** ...

  5. 海康28181摄像头接入的注意点

    对一个海康摄像头以28181协议接入(海康摄像头设备级的接入,非系统级别接入),分为两步: 通过sip invite将海康的ps流拉出来,由于是设备级的接入,所以直接对摄像头进行invite发起点播( ...

  6. java接口方式调用海康大华摄像机预览。

    客户有海康和大华的监控设备,没有买各类安防平台,国标方式需要预留给其他需要接入的系统,得兼容高版本chrome,询问了大华的客服人员,最后选择了该方案进行解决,记录下曲折的过程.延迟大约10秒的样子, ...

  7. java 调用dll_Python调用海康SDK抓取红外图像

    海康SDK提供了C++.C#.Java等示例代码,可以使用这些语言进行二次开发.对于做算法开发的人来说,就想快速采集到图像,然后在Matlab或Python里对图像进行分析,使用C++.C#.Java ...

  8. java 摄像头_Java 实现 海康摄像头抓拍图像 Windows、Linux

    先抱怨一下,打死都想不到,海康的摄像头SDK居然是一个Java类,还有必须的两个jar包(jna.jar,examples.jar).鬼能想得到会这么命名. 下面开始吧. Windows 把从官网下载 ...

  9. java web页面调用海康摄像头

    之前做过web页面调用海康显示4个摄像头.网上web调用的确实比较少,我做的时候参考了http://blog.csdn.net/lucius93/article/details/75308165,但也 ...

最新文章

  1. 从动力学角度看优化算法:一个更整体的视角
  2. ScrollView内嵌ListView或GridView的滑动处理
  3. linux系统构架ftp,用Linux系统构建高效FTP服务器
  4. ios android 交互 区别,很多人不承认:iOS的返回交互,对比Android就是反人类。
  5. html制作卡通图案代码,CSS画的卡通动画图案
  6. java number 转 long_Java Number.longValue()用法及代码示例
  7. bzoj1597 [Usaco2008 Mar]土地购买
  8. 杭电OJ(HDU)-ACMSteps-Chapter Three-《FatMouse#39; Trade》《今年暑假不AC》《排名》《开门人和关门人》...
  9. version for mac 破那啥版
  10. SqlServer-RBAC五表权限
  11. 为什么函数lamda显示权限不足_C++常用内置函数
  12. java redis令牌桶_redis实现的简单令牌桶
  13. am3352 安装ssl
  14. SpringCloud(part12)Spring OAuth2--案例
  15. 计算机win7如何加快开机速度,win7如何提高开机速度实现8秒内完成开机【图文】...
  16. Oracle后台进程及其作用简介
  17. Pandas DataFrame.columns用法及代码示例
  18. vue返回上一页面时记忆回到原先滚动的位置
  19. doctype html5什么意思,是什么意思?
  20. Isolation Forest 孤立森林

热门文章

  1. 【Java】正则表达式 Pattern Matcher
  2. 默认计算机网络密码是多少,秘密:moshujia.cn默认密码?
  3. 最新保险法全文(2016最新版本)
  4. win7html.exe,Win7无法打开exe可执行文件弹出打开方式的对话框
  5. Java之数学工具包Math
  6. 后ARM时代,嵌入式工程师的自我修养
  7. Unity学习-制作台阶和门
  8. mysql截取前几个字符串_mysql 截取字符串 函数
  9. 哪款耳机适合华为手机?华为手机无线耳机推荐
  10. [luogu P1438] 无聊的数列