做了将近三年时间的视频监控客户端开发,当然期间也做个一些其他开发。在开发期间,经对系统不断进行重构优化积累了一些经验,现向大家分享一下。希望以此抛砖引玉,有这方面经验的朋友也发表一下看法和见解:

首先看下项目需求:
  1.最多同时支持16路高清音视频同时显示。
  2.窗口模式,全屏,1窗口,4窗口,9窗口,16窗口。
  3.播放控制,开始播放,停止播放,开启音频,停止音频,云台控制,Camera管理。

下面谈谈设计方案:

1.总体设计,按照码流数据流向,可以将系统分成三层:

网络层,负责码流的接收,数据的解包,以及网络故障的处理。
  解码显示层,网络层将数据解包后提交给解码层,解码层负责码流解码和图像显示。
  UI层,负责响应消息并进行处理。

处理原则:层与层之间尽量独立,比如网络层发现网络故障后,进行以下处理:

1.通知UI网络故障。
  2.自行进行网络重连。
  3.故障恢复后通往UI层网络故障恢复。

期间并不需要通知解码显示层暂停解码显示。解码显示层收不到网络层提交的码流,自然会暂停解码

1.线程模型

先前的时候我的实现方式是,针对每一个播放窗口开一个线程,在这个线程中进行码流接收,然后进行解码显示。后来发现有诸多问题,其中最严重的就是解码耗时过长导致发送端经常出现发送超时的情形。

现在的实现方式是针对以上各层实现三类线程:
  
  网络数据接收线程:负责网络数据接收,网络连接建立。由于最大只有16路码流数据,使用select进行多路复用足够满足我的需求。网络层还负责对码流数据进行解包和校验,测试证明进行数据解包和校验并不影响网络层的数据接收实时性。

解码显示线程:负责数据的解码和显示,开始我分别使用Semaphore和Event进行线程同步,这样造成了诸多不便,比如程序退出时需要SetEvent唤醒解码线程,暂停和开始播放也需要进行特殊处理,后来我采用最简洁明了的方式:用一个Sleep(1)解决了诸多同步上的问题。
while(!bExit)
{
if(bPlay)
{
 if(有数据)
解码显示一帧数据;
 else 
Sleep(1);
}
}
   UI线程,主要负责消息响应,UI线程在任何时候都不能阻塞,比如登陆操作直接提交给网络层,网络层收到登陆响应后再通知UI。

2.数据模型

网络层收到数据经解码后得到一帧一帧数据,由于每帧数据长度非常大(I帧比P帧长的多),定义一个固定长度的缓冲区存放一帧数据不是很好的做法。使用链表则会不断的分配和释放内存,造成内存碎片。使用循环缓冲区会增加一次数据拷贝。为此我对循环缓冲区进行扩展:
   
   每次写入一帧数据,写入一帧数据之前先写入该帧数据的长度。
   如果到了缓冲区的末尾,无法容纳一帧完整的数据,直接跳到缓冲区的开始位置写入数据。当然需要进行一些特殊处理。

3.其他方面:
   使用Directshow框架可以方便解码显示,Directshow采用DirectDraw进行图像显示,效率有明显的提升。
   Directshow的窗口模式比无窗口模式要容易控制,比如针对某个窗口进行显示和隐藏。
   全屏播放的最好方法是:先将窗口最大化,置顶,然后隐藏窗口的标题栏,边框,窗口上的其他控件,取消全屏进行逆操作即可。

4.实现难点

我觉得最难得是音视频同步,因为接收的是实时码流,对时延要求较高,不能使用较大的缓冲,所以造成诸多问题,解决这些问题发了我相当大一部分时间,这个留作下回再做讨论吧。

视频监控客户端开发(IP Camera)总结相关推荐

  1. 音视频开发(18)---视频监控客户端开发(IP Camera)总结

    视频监控客户端开发(IP Camera)总结 首先看下项目需求:   1.最多同时支持16路高清音视频同时显示.   2.窗口模式,全屏,1窗口,4窗口,9窗口,16窗口.   3.播放控制,开始播放 ...

  2. 基于wifi面向android的远程视频监控客户端开发,基于Wifi面向Android的远程视频监控客户端开发...

    龟寻世界<<<I 心设备,所有的视频信号必须送到切换 台,导演再通过它对所有的图像信号进 行选择和特技处理 ,最后才能得到我们 所需要的节目信号.DFS一700P作为数字 设备,具有 ...

  3. 视频监控软件开发的需求管理

    视频监控软件开发的需求管理 摘要:项目需求管理的目的是确保各方对需求的一致理解,管理和控制需求的变更,从需求到最终产品的双向追踪.项目的需求管理可以在很大程度上影响项目的成败.本文以"××职 ...

  4. 网络监控2013:IP Camera民用市场暴增

    网络监控2013:IP Camera民用市场暴增 时间:2014-01-03  来源:CPS中安网         随着网络视频监控的蓬勃发展,公用和民用监控市场需求猛增,给安防行业带来了更多的机遇和 ...

  5. Duilib版视频监控客户端(简易版)

    Duilib版视频监控客户端(简易版) 基于目前物联网发展的形式,网络视频监控几乎无处不在,对监控的视频的查看和回放自然成了必不可少的部分,下面介绍一下使用Duilib来开发的视频监控客户端例子. 界 ...

  6. 《华清远见学习手记》 之3G智能机器人——移植视频监控客户端到我的Nokia E52上

    移植视频监控客户端到我的Nokia E52上 [编译环境]ubuntu 8.10 + Vmware + windows xp [目标机]Nokia E52 / symbian s60 v3 [交叉编译 ...

  7. 视频监控客户端-GB28181之转码库-转码格式支持H265、H264、MPEG4、MPEG2

    视频监控客户端-GB28181之转码库-转码格式支持H265.H264.MPEG4.MPEG2 如需交流可联系QQ:123011785 转码库的基本内容是通过ffmepg的函数进行转码,主要针对市面上 ...

  8. 海思Hi3518Ev200 4G wifi无线网络视频监控摄像开发板可二次开发

    21世纪,经济社会及物联网,云计算,社会网络,车联网等新型移动通信业务日新月异的发展,2013年,我们的通信技术进入了第四代的移动信息系统--4G通信技术.网线下的网络已不能满足需求,人们对移动通信网 ...

  9. 也用C#做个视频监控客户端来玩玩

    前几天看到园友农民伯伯写的C# 视频监控系列实现了对海康板卡的封装,这几天参与的项目进入了后续阶段了,现进行性能测试.测试流媒体服务器的稳定性,并发性,看看并发处理300-500路视频效果如何,部门没 ...

最新文章

  1. Linux(CentOS 5)下安装Oracle10 客户端(转)
  2. CentOS-64位安装mysql5.7
  3. SAP Spartacus加载delivery region的实现
  4. 计算机考研的调查和改进建议
  5. rds oracle,Amazon RDS Oracle数据库托管
  6. Jenkins pipeline+Maven+Gitlab
  7. NLP领域首个国家杰青,回归母校!
  8. 【安卓9】数据库升级
  9. 华为手机解锁码计算工具_手机计算器全线阵亡?小编实测苹果、华为、三星……...
  10. 在线投稿审稿管理系统mysql_某期刊在线投稿审稿管理系统.doc
  11. daemontools的安装、示例、简介
  12. 精读《磁贴布局 - 功能分析》
  13. 计算机房低压配电系统,机房工程之配电系统
  14. 简单因式分解100道及答案_初中数学因式分解练习题及答案.doc
  15. 【无敌Python 】增强视频画质,就应该这么做
  16. 2020考研-王道数据结构-图-图的遍历
  17. Deep Learning之手写数字识别
  18. 数据挖掘—逻辑回归分类—信用卡欺诈分析
  19. VB版机房收费系统流程图--00
  20. 完美解决安装MySQL Install/Remove of the Service Denied!错误解决办法

热门文章

  1. [ABC283D] 题解
  2. 重磅!VirtualXposed,让你无需Root也能使用Xposed框架!
  3. 启发式算法与元启发式算法的区别
  4. 【XSY3549】Tree(线段树,换根)
  5. Linux df du 命令
  6. blender绑定骨骼法 2 rig
  7. [Python] 相关性分析
  8. php修改头像接口,thinkphp修改头像
  9. 5.mysql的数据结构
  10. 关于解决主机和虚拟机ping不通的问题