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

简介:

  前几天看到园友农民伯伯写的C# 视频监控系列实现了对海康板卡的封装,这几天参与的项目进入了后续阶段了,现进行性能测试.测试流媒体服务器的稳定性,并发性,看看并发处理300-500路视频效果如何,部门没有那么多电脑用来测试,简单写了一个模拟客户端访问的程序来测试服务端程序性能.流媒体是用C++语言实现的,我现在要使用C#与之通信,会涉及下面几个方面内容.举例我现在想浏览前端大华的DVR/DVS上某一路视频,这里我们采用流媒体连接视频监控设备而非客户端去直连设备,流媒体接收到数据后再一一转发给当前想预览该路视频的客户端,客户端使用大华的PlaySDK解码播放.(至于通过大华NetSDK直连设备,你可以到大华网站下载其SDK包,当前最新版本好像是3.4,有提供封装好的C#访问Demo程序;这里流媒体支持多种厂商的监控设备的接入,包含海康,大华等)

客户端视频预览一般过程

1)如果当前已有画面正在预览,发送停止正在预览该路画面命令到服务端,关闭该路视频

一般调用PLAY_StopSound,PLAY_Stop,PLAY_CloseStream函数停止该路视频预览

2)发送视频预览请求

打开视频输入流PLAY_OpenStream,PLAY_Play,PLAY_PlaySound(同时开启音频);然后可以专门开一视频数据接收线程,把接收到视频数据提供给函数PLAY_InputData解码播放即可

   一般C++下我们进行网络传输模块开发,会采用结构体来封装组织通信报文,那采用C#开发的流媒体客户端程序需与服务端流媒体通信,就会碰到怎么把一个结构体转成一个byte数组,以及如何把收到的byte数组数据还原成结构体对象.我们这里就涉及到了C#与其它语言的互操作,也就是所谓的P/Invoke技术,主要也就是System.Runtime.InteropServices命名空间下的Marshal类的使用.(可参考园友tuyile006文章struct和byte[]相互转换(用Marshal类实现))还有就是C++与C#之间数据类型转换如unsigned char-->byte,char * -->string,HWND-->IntPtr,LONG/DWORD-->int,传递空指针使用IntPtr.Zero等(农民伯伯在其C# 视频监控系列(14):总结贴——VC++代码转成C#小结也做了一些介绍,可借鉴C#封装的海康DVR客户端SDK )

  接下来就实现代码,编译通过,运行一下.呀,弹出了一个提示在所指定的dll文件中找不到某函数的入口地址,检查代码,原来太粗心把函数PLAY_OpenStream定义成了Play_OpenStream,汗一个先,以后写程序要注意.(函数调用不成功,一般是函数定义错误,如函数名称或参数数据类型错误,可参考文章BugHunter 也谈c#调用C++的DLL找不到入口点 )最终效果如下图,很粗劣,大家不要见笑,画面1传输是文件流,画面2是实时视频流数据.


本文转自peterzb博客园博客,原文链接:http://www.cnblogs.com/peterzb/archive/2009/05/31/1493239.html,如需转载请自行联系原作者。

目录
相关文章
|
9月前
|
XML 测试技术 API
利用C#开发ONVIF客户端和集成RTSP播放功能
利用C#开发ONVIF客户端和集成RTSP播放功能
4715 123
|
设计模式 IDE API
C# 一分钟浅谈:GraphQL 客户端调用
本文介绍了如何在C#中调用GraphQL API,涵盖基本步骤、常见问题及解决方案。首先,通过安装`GraphQL.Client`库并创建客户端实例,连接到GraphQL服务器。接着,展示了如何编写查询和突变,以及处理查询语法错误、变量类型不匹配等常见问题。最后,通过具体案例(如管理用户和订单)演示了如何在实际项目中应用这些技术,帮助开发者更高效地利用GraphQL。
324 38
C# 一分钟浅谈:GraphQL 客户端调用
|
设计模式 API 数据处理
C# 一分钟浅谈:GraphQL 客户端调用
本文介绍了如何在C#中使用`GraphQL.Client`库调用GraphQL API,涵盖基本查询、变量使用、批量请求等内容,并详细说明了常见问题及其解决方法,帮助开发者高效利用GraphQL的强大功能。
403 57
|
存储 消息中间件 NoSQL
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
1224 8
|
网络协议 C# C++
BytesIO | 零基础轻松看懂 C# TCP客户端(完整源码+视频教程)
零基础轻松看懂 C# TCP客户端(完整源码+视频教程) 如果非IT行业的女朋友都能学会的话,应该就算0基础入门的教学视频了吧! 超简单的C# TCP开发入门,短短的代码,完整的功能,掏出你的VS码一个试试手吧!
416 0
BytesIO | 零基础轻松看懂 C# TCP客户端(完整源码+视频教程)
|
Web App开发 网络协议 安全
C# | 实现QUIC协议的客户端与服务端
QUIC(Quick UDP Internet Connections)是一种基于UDP协议的可靠、安全、高效的传输协议,由Google开发。它是HTTP/3协议的基础,并被视为未来互联网传输层协议的重要候选者之一。 与TCP不同,QUIC协议使用多路复用(Multiplexing)技术,可以在一个连接上同时传输多个数据流,这些数据流可以独立于彼此进行流量控制和拥塞控制,从而提高了传输效率。此外,QUIC协议还支持零RTT握手,即在第一次连接时就可以发送数据,进一步减少了延迟。
685 0
C# | 实现QUIC协议的客户端与服务端
|
C# Python
基于Flask创建Python服务端,并调用Python客户端、C#客户端
基于Flask创建Python服务端,并调用Python客户端、C#客户端
389 0
项目实战:Qt编译Qt库以及使用C#调用Qt库,并实现C#集成Qt的tcp客户端
项目实战:Qt编译Qt库以及使用C#调用Qt库,并实现C#集成Qt的tcp客户端
项目实战:Qt编译Qt库以及使用C#调用Qt库,并实现C#集成Qt的tcp客户端
|
NoSQL Redis C#
C#两大知名Redis客户端连接哨兵集群的姿势
我的思路是将Redis、Sentinel、Redis Client App链接到同一个网桥网络,这个网桥内的Redis Client App就可以使用ContainerIP访问网桥内任意redis节点。
C#两大知名Redis客户端连接哨兵集群的姿势
|
设计模式 缓存 NoSQL
U3D客户端框架之类对象池技术优化C#语言GC
类对象池,类似对象池,顾名思义就是一定数量的已经创建好的类对象(Object)的集合。当需要创建对象时,先在池子中获取,如果池子中没有符合条件的对象,再进行创建新对象,同样,当对象需要销毁时,不做真正的销毁,而是将其对象SetActive(false),并存入池子中。这样就避免了大量对象的创建销毁,减少了GC,优化了性能。