视频监控客户端开发(IP Camera)总结

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

首先看下项目需求:
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.实现难点

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

大家有问题可以回复该帖,我会尽力答复。
...全文
4946 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
wshen7 2015-01-04
  • 打赏
  • 举报
回复
在浏览器端键入摄像头的IP后显示的是一个监视画面和操作控制界面。 能实现只显示监控界面而没有操作界面吗? 目的是为了让许多人看,但是不允许更改设置什么的啊!!! 虽然问题很简单,但是还是希望有大神解答!!!我连新手,菜鸟都算不上
wlp_1554416562 2014-04-15
  • 打赏
  • 举报
回复
求代码学习啊!!!!!
linbao08 2013-12-04
  • 打赏
  • 举报
回复
您好, 能把您打代码给我发一份吗, 学习下啊
dangers_boys 2013-11-12
  • 打赏
  • 举报
回复
希望能做视频监控客户端
yq_m 2013-11-11
  • 打赏
  • 举报
回复
音视频同步真没什么好办法,流媒体服务器用达尔文的,那也是一个超级大难点,h264、mpeg4,很辛苦。向做这行的兄弟致敬。
木头人来也 2013-11-09
  • 打赏
  • 举报
回复
楼主: 你好,有QQ吗?希望能与你交流,向你学习。我的QQ:363691124
CAINIAO123 2013-11-09
  • 打赏
  • 举报
回复
厉害啊 ,学习了
allenjiao 2013-11-07
  • 打赏
  • 举报
回复
不错,同行,希望以后能多多交流沟通
laowang2 2013-11-07
  • 打赏
  • 举报
回复
嗯,有流媒体服务器也介绍一下。
beyondcj 2013-11-06
  • 打赏
  • 举报
回复
jiachaofrms 2013-11-06
  • 打赏
  • 举报
回复
瓶颈主要是高清解码,一般解码解不过来,多路的时候,要么延时高,要么跳帧,有好的解决办法么?
fishion 2013-11-05
  • 打赏
  • 举报
回复
好帖子,都认真看了,希望LZ有更精彩的帖子
tiantian1980 2013-11-05
  • 打赏
  • 举报
回复
学习了,不过用不到
xusir98 2013-11-05
  • 打赏
  • 举报
回复
怒小诗 2013-11-04
  • 打赏
  • 举报
回复
学习了,一向只知道使用,了解下也不错
liuduo251 2013-11-04
  • 打赏
  • 举报
回复
这个学习了,对俺有用
hslinux 2013-11-04
  • 打赏
  • 举报
回复
引用 24 楼 lunat 的回复:
新兴的热门行业,马上就不小众了。视频监控仍处在爆发式增长的时候。
还新兴啊?04年毕业的时候进去的公司就是做这个的,进去之前公司也都在做这个。。。。。。
金牛笑笑生 2013-11-04
  • 打赏
  • 举报
回复
_菜菜 2013-11-04
  • 打赏
  • 举报
回复
做过GB28181,且还只是做到一半的路过
laowang2 2013-11-04
  • 打赏
  • 举报
回复
加载更多回复(29)
当前网络摄像机(IP Camera)、视频服务器(DVS)应用越来越广泛,大有与传统硬盘录像机(DVR)平分秋色之象,能有一种方案能将以上各类设备集中在一起应用,软件的服务器能集录像、流媒体服务、及相关报警服务于一体,用网络应用的方式实现传统的DVR相关功能,而超过嵌入式DVR的服务能力。比如传统的嵌入式DVR存储与视频服务等功能能务有限,无法满足上百路,甚至几百路的存储与视频服务需求。这就大大的减少的整个系统的费用。 开发的Smart VM 具有如下几点优点: 1,通过网络摄像机、网络快球组成新一代NVR视频应用系统,可录像、视频服务、回放、及网络摄像机上的IO 报警输入输出管理等工作。可以取代传统的板卡与嵌入式DVR应用。 2,通过DVS 组合新一代NVR视频应用系统,完全实现DVR所能实现的所有功能.网络化应用。足以取代传统的板卡与嵌入式DVR应用。 3,传统嵌入式DVR联网应用, 当DVR 几台或几百台时,仍然可以使用Smart VM系统进行集成联网应用, 此时 Smart VM 的客户端可以象传统的集中监控系统一样工作。 4, Smart VM 具有多种品牌的兼容集成能力,如国内海康、大华、恒亿等主流品牌的DVR,DVS,IP Camera 5, Smart VM 内置了 Web服务器组件,用户不用再为BS应用去安装传统的IIS, Tomcat 环境等。客户端的组件COM化,支持CS调用,又支持BS调用。 6, Smart VM 加强了报警服务功能,能收集各品牌的视频设备的视频丢失等功能、IO报警、硬盘状态等基本报警,还能集成新一代具有智能分析的品牌的DVS,IP Camera 报警,同时,报警的联动逻辑可以自定义. 组态的报警事件管理方法,用户可以定义一系统的报警条件,一系列的报警执行的联动动作(如报警后录像,开关输出信号量,打开视频等),根据触发条件,执行相关动作。
Android Camera开发入门:目录 第一篇: 前景  一、Android Camera开发前景;      1)camera相关应用的领域      2)相关岗位介绍;      3)市场招聘介绍;      4)发展前景介绍;  二、学习这门课的重要性;      1)适合的人群;      2)熟悉和了解Android Camera 应用开发流程的重要性 第二篇: 开发环境安装  一、jdk、sdk的配置;  二、android studio的安装介绍;  三、adb命令的使用; 第三篇: Camera 常用api和最新框架介绍  一、android camera api介绍      1)camera1、camera2 区别;      2)camera 1、camera2 常用api介绍;      3)android camerax;  二、android camera最新框架介绍 第四篇:Camera api1实现预览、拍照、录像功能  一、预览  二、拍照  三、录像  四、获取实时预览流 第五篇: Camera2相机 打开功能实现第六篇: Camera2相机 预览功能实现  1)surfaceview、textureview 第七篇: Camera2相机 拍照功能实现 1)单拍; 第八篇:Camera2相机 录像功能实现1)正常录像 第九篇:Camera2预览方向、拍照方向设置     1) 预览变形问题如何处理? 第十篇:YUV流处理  1)如何获取实时预览流?  2)  思考:双码流方案如何实现?一边本地录像,一边后台推流 第十一篇:dumpsys media.camera 第十二篇:Camera2 Zoom变焦第十三篇:人脸识别(android 原生 & 三方人脸识别算法)第十四篇:Uvc UsbCamera第十五篇:Android Camera2拍摄RAW图第十六篇: Android Camera2同时打开前后摄 并 录像第十七篇: Android Camera2 视频慢动作  附:1)提供android开发相关资源      软件工具、Android相关学习书籍、学习相关网站博客等链接2)提供课程讲解中设计到的App 源码    * Camera API1使用源码    * Camera API2使用源码    * 调用三方算法人脸识别源码    *  录像慢动作源码    * Uvc UsbCamera相关源码3)课件

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧