C#Winform调用EasyDarwin项目中的libEasyPlayer.dll

c# 调用c++ lib静态库 四个步骤 1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库 3.导出C接口 4.c#调用c++动态库 开始你的表演... ①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目 空白解决方案的创建: 添加Visual C++ , Win32 项目 这...... 阅读详情

本想把这个测试项目优化完再写经验的,想想还是现在就记下来吧,到时候再写恐怕都忘的差不多了,言归正传.

最近在研究EasyDarwin项目,这个开源项目对车载视频监控项目开发来说真是个福音,起码让我这没有门路的人找到了头绪,下载资源学习了解也不短时间了,但由于当前项目的客户端是基于C#开发的,要想将RTSP播放器集成到当前项目里就得考虑C#调用C++的DLL问题了.现在说下引用libEasyPlayer.dll的注意事项:

我的编译环境是VS2017,C#项目基于.NET4.0.

1.下载EasyPlayer-2.0.17.0709版本代码,VS打开会提示升级到WIN10 SDK以及VC++141,升级即可,编译正常.

该项目中包含了libEasyPlayer项目,作者已经很好的将API给包装完好,对外调用的API文件为libEasyPlayer.h文件.

2.创建C# Winform项目,需要注意的是目标平台不要选择AnyCPU,选择X86,即32位应用,大部分C++的DLL都是32位应用,因为这样可以兼容大部分的平台.

3.现在将项目bin目录中的dll文件复制到C#项目的Debug目录下,ImageOle.dll以及npEasyPlayerPlugin.dll这两个DLL文件是不需要的,可以不复制.

4.将C++的API转为C#本地方法在这里需要使用一个工具,微软出的Invoke Interop Assistant,这个工具可以将.h头文件中的API接口函数转为C#的本地方法,但初次使用可能会摸不准门路,昨天我就忙活了半天,上截图

选中第三个TAB页,语言选择CSharp(默认的),在Native Code Snippet框中输入要转换的libEasyPlayer.h头文件代码,#define,#include之类的代码就不要复制进去了,可以看到太复杂的函数还是无法正常转换的,这里的EasyPlayer_OpenStream就不可以了,恰恰这个函数最麻烦...

5.创建一个PlayerMethods本地方法类,将生成的方法复制进去,DllImportAttribute中的<Unknown>改为DLL文件名,即libEasyPlayer.dll,将其它的结构体等新建对应的实体类并复制代码,这里我将一些结构名给改了,其实就是WIN32API中定义的数据,为了防止跟其它定义冲突,重新命名了,比如RECT,Point等...我打算将这些封装成一个C#的DLL偷笑

6.最后还少了一个OpenStream函数没有定义啊,仿照其它生成的方法写一个

[DllImport("libEasyPlayer.dll", EntryPoint = "EasyPlayer_OpenStream")]
public static extern int EasyPlayer_OpenStream(string url, IntPtr hWnd, RENDER_FORMAT renderFormat,
                                         int rtpovertcp, string username, string password, MediaSourceCallBack callback, IntPtr userPtr, bool bHardDecode);

该方法的原型是:

LIB_EASYPLAYER_API int EasyPlayer_OpenStream(const char *url, HWND hWnd, RENDER_FORMAT renderFormat,
    int rtpovertcp, const char *username, const char *password, MediaSourceCallBack callback=NULL, void *userPtr=NULL, bool bHardDecode=true);

其它的好说,但void *userPtr这个参数不好传入,示例应用传入的是窗体,那我先定义为IntPtr传入窗体句柄吧.

MediaSourceCallBack是个回调函数,在此我定义了个委托声明:
public delegate int MediaSourceCallBack(int channelId, IntPtr channelPtr, int frameType, string pBuf, [MarshalAs(UnmanagedType.LPArray)] RTSP_FRAME_INFO[] frameInfo);

原型为:
typedef int (CALLBACK *MediaSourceCallBack)( int _channelId, int *_channelPtr, int _frameType, char *pBuf, RTSP_FRAME_INFO* _frameInfo);

最后的RTSP_FRAME_INFO结构我为什么定义为数组呢?源代码中就没使用数组方式,因为RTSP_FRAME_INFO是结构体,无法传入空,还有一种方法可以定义为RTSP_FRAME_INFO?格式,这样可以为空,目前还未测试过,等测试看看.

到这里大体的代码就搭出来了,在Winform窗体的Load事件中调用EasyPlayer_Init();方法,编译通过,想想都激动啊,这期间我说的可能有遗漏,如果遇到问题请自行排除错误偷笑.

但是,老天爷会让你这么顺利的就调试通过吗?!很明显,不会~!

提示我找不到libEasyPlayer.dll模块,什么鬼,明明在运行目录下的,度娘得知这个DLL应该还有引用的DLL我没复制过去,一查,果然有....复制过去,然后嘞?

还是运行错误,不过错误提示变了,提示找不到EasyPlayer_Init入口点,怎么会?一样的不是,还是度娘啊,用DLL查看器查看入口方法是?XXX@ABC之类的格式,而且用的DLL查看器还没有办法将这些函数复制出来,咋办?其实VS自带了这种工具,打开VS开发人员命令工具,在开始菜单Visual Studio Tools里面找,VS里面直接打开的命令行不好使,应该是我技术问题,进入libEasyPlayer.dll目录,输入dumpbin /exports libEasyPlayer.dll /out:libEasyPlayer.txt命令,即可将入口函数输出到指定的txt目录中,当然如果不想输入文本而只想在命令行中查看的话,可以删掉/out及之后的代码即可.

接下来将正确的入口点写入到各方法的EntryPoint特性中,并整理一下:
        [DllImport("libEasyPlayer.dll", EntryPoint = "?EasyPlayer_Init@@YAHXZ")]
        public static extern int EasyPlayer_Init();

再运行,OK了~!

那么接下来就照搬作者的示例程序写一个窗口代码吧,照搬过来后,编译OK,激动啊,运行,没问题,哈哈~!~!输入RTSP链接,播放....问题来了....出现异常:

调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

这是什么鬼,难道我的OpenStream里定义的委托不对?改了又改,没用,试试其它方法,只要是带参数的都出这个异常,度娘吧,别说现在度娘还是挺给力的,有参数的需要添加一个特性CallingConvention = CallingConvention.Cdecl,这样就OK了,将OpenStream的方法贴出来

		/// <summary>
		/// 打开媒体流
		/// </summary>
		/// <param name="url">RTSP流链接</param>
		/// <param name="hWnd">要绘制视频的窗口句柄</param>
		/// <param name="renderFormat">绘制方式</param>
		/// <param name="rtpovertcp">RTC是否为基于TCP方式,0为否,1为是</param>
		/// <param name="username">用户名</param>
		/// <param name="password">密码</param>
		/// <param name="callback">回调方法,用于播放事件通知</param>
		/// <param name="userPtr">用户自定义指针,一般传入当前的窗体,不是窗体句柄</param>
		/// <param name="bHardDecode">是否硬件解码,0为否,1为是</param>
		/// <returns></returns>
		[DllImport("libEasyPlayer.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?EasyPlayer_OpenStream@@YAHPBDPAUHWND__@@W4__RENDER_FORMAT@@H00P6GHHPAHHPADPAURTSP_FRAME_INFO@@@ZPAX_N@Z")]
		public static extern int EasyPlayer_OpenStream(string url, IntPtr hWnd, RENDER_FORMAT renderFormat,
										int rtpovertcp, string username, string password, MediaSourceCallBack callback, IntPtr userPtr, bool bHardDecode);

至此,C#已经基本正常调用libEasyPlayer.dll库了,上个运行截图:


该项目代码等完善了再上传吧...


C#实现Windows开机自启动应用程序 上述代码通过打开当前用户的注册表项"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",并将应用程序的路径添加到该项中,实现了开机自启动的设置。在本篇文章中,我将向您展示如何使用C#编写一个应用程序,以实现在Windows系统启动时自动启动该应用程序的功能。现在,当您的应用程序启动时,它将自动将自己添加到Windows注册表中的开机自启动项。请记住,当您的应用程序不再需要开机自启动时,您可以通过删除注册表中的相应项来禁用该功能。步骤 2: 引用必要的命名空间。 阅读详情

相关推荐

EasyPlayer-RTMP-Win:一个优雅,简单,快速的Windows RTMPPlayer。EasyPlayer-RTMP支持RTMP,视频支持H.264H.265,音频支持AAC!EasyPlayer RTMP是一款精炼,高效,稳定,灵活的RTMP流媒体播放器,视频支持H .264,可以扩展H.265,音频支持AAC,可以扩展更多音频格式,完全完全自主研发,非常灵活使用!

EasyPlayer-RTMP-Win EasyPlayer RTMP Windows播放器是由开发和维护的一个RTMP协议专版流媒体播放器项目,对RTMP能实现超低延迟播放。目前支持Windows , Android平台, iOS平台,支持多窗口。视频支持H.264,H.265 ,音频支持AAC 。 代码及编译方法 Windows:vs2010编译; 工作流程 功能特点 超低延迟的RTMP播放器; 超强的设备兼容性和可定制性; 完美支持多窗口多实例播放; 支持播放端Buffer实时设置,成熟的低延迟追帧技术; 秒开播放功能; 支持自定义播放布局; 编解码,显示,播放原始码全开放,更加灵活; 支持OSD文字水印; 支持实时录像,立即抓图; 详尽的日志记录输出最小; 最新版本下载 EasyPlayer-RTMP Windows播放器: : 演示效果 EasyPlayer项目体现说明 √

FFmpeg4.3系列之19:EasyDarwin流媒体直播

我将带领大家一起来学习:亲手搭建环境EasyDarwin流媒体直环境包括ubuntu18,win10,进行直播推流拉流具体内容包括:  1.Ubuntu18和win10安装配置EasyDarwin。2.ffmpeg推流、vlc拉流。3.EasyPusher推送本地Mp4文件。4.EasyPlayer播放直播流。 音视频与流媒体是一门很复杂的技术,涉及的概念、原理、理论非常多,很多初学者不学 基础理论,而是直接做项目,往往会看到c/c++的代码时一头雾水,不知道代码到底是什么意思,这是为什么呢? 因为没有学习音视频和流媒体的基础理论,就比如学习英语,不学习基本单词,而是天天听英语新闻,总也听不懂。所以呢,一定要认真学习基础理论,然后再学习播放器、转码器、非编、流媒体直播、视频监控、等等。 梅老师从事音视频与流媒体行业18年;曾亲手主导广电直播全套项目,精通h.264/h.265/aac,曾亲自参与百度app上的网页播放器等实战产品。目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。

libEasyPlayerPro接口说明1

声明如下:int EasyPlayerPro_SetLogo (void* hplayer, int bIsUse, int ePos, int eStyle,

C#调用EasyPusher推送到EasyDarwin实现视频流中转

最近在公司项目中,遇到需要将内网的监控视频信息,在外网进行查看,最终通过查阅资料,发现EasyDarwin 能够实现该需求,由于该开源组件是用C++进行开发,在C#调用方面资料较少,也有可能是我没有找到的原因,进过不少坑,所以对EasyDarwin的使用过程做个记录,希望能够帮助到使用该开源组件的童鞋们,文中有不对的地方,望大家指出,谢谢。 一、部署EasyDarwin流媒体...

angcaoche3123的博客 633

EasyPlayerPro-Win-master_H264流媒体播放器。_EasyPlayerPro_

万能流媒体播放器,其中H264用于监控,由EasyPlaye研发,特此推荐。

Windows11上CUDA 12.3配PyTorch踩坑记:一条官网命令救了我的GPU加速

本文详细介绍了在Windows 11上配置CUDA 12.3与PyTorch的完整指南,包括环境准备、安装要点、兼容性解决方案和性能验证。通过官方推荐的conda命令和实用技巧,帮助开发者解决常见问题,实现高效的GPU加速,提升深度学习开发效率。

weixin_42528974的博客 109

c# winform h.265解码

第一步: 运行install.bat文件,本地注册队友activex控件. 第二步: 工具箱–选项卡–com–选择aPlayrer,随后作为普通控件使用 第三步: 程序运行前,必须在电脑上先注册控件,否则会导致程序应用报错打不开. ...

qq_46603687的博客 1357

机器人关节电机发热难题:从工程化角度拆解热管理解决方案(下)

摘要:本文系统分析了机器人关节电机与驱动系统的热管理方案,重点解决局部热点问题。针对不同功率场景提出了热管/均热板散热(适用于中小功率)和液冷散热(适用于高功率)的具体实施方案,详细比较了结构参数、材料选择、安装工艺和散热效果。特别强调了电机-驱动协同热管理的重要性,提出"工况联动+热路径共享"的核心理念,包括一体化散热结构设计和动态控制策略。最后介绍了热仿真与测试验证方法,确保方案的有效落地。通过系统级热管理,可显著降低温升(热点区域降温30-60℃),同时优化体积和能耗。

bother3000的博客 3329

H.265编码安防视频播放器EasyPlayer-RTSP-WIN版编译C#DEMO如何更换授权?

TSINGSEE青犀视频云-边-端架构产品都是需要授权才能使用的,比如RTSP协议平台EasyNVR、RTMP协议平台EasyDSS、GB28181协议平台EasyGBS等,包括EasyPlayer播放器系列的demo,也同样需要授权使用或者编译。 有开发者在获取了EasyPlayer-RTSP-WIN版C#DEMO的时候,编译运行程序后,发现程序提示授权时间已过,那么如何更新授权呢? 打开EasyPlayer-RTSP-WIN版C#DEMO的时候,我们可以看到两个项目,如下图: 其中Easy

TSINGSEE青犀视频官方技术博客 585

接入 deepseek 实现AI智能问诊

必须包含user角色,用于传递用户输入。system角色可选,用于设置对话背景。多轮对话需要将历史记录添加到messages中。

weixin_51326478的博客 6541

在 Ansys Mechanical 中使用“螺栓工具”插件自动生成螺栓

在有限元分析 (FEA) 中,高效创建螺栓连接对于确保机械装配的结构完整性和性能至关重要。螺栓是连接组件不可或缺的一部分,它们在负载下的精确建模会影响整个系统。快速高效的螺栓建模使工程师能够快速优化设计,满足紧迫的期限,并通过为其他关键设计任务释放资源来提高整体生产力。此外,螺栓建模的精度可以最大限度地降低模型创建过程中出错的风险,这对于获得可靠和准确的分析结果至关重要。因此,在 FEA 中快速且无错误地创建螺栓连接对于高效、可靠和成功的工程结果至关重要。

jkh920184196的博客 3101

vs2010下C++调用lib或dll文件

注:   DLL:表示链接库,包含dll,lib文件;   dll: 表示my.dll文件   lib: 表示my.lib文件   C++ 调用.lib的方法: 一: 隐式的加载时链接,有三种方法   1  设置工程的 Projects来加载DLL的lib文件   打开工程的 Projects菜单,然后在Linker/Additional Libra

feifeilujie的专栏 1592

机器人动力学仿真软件:Webots_(14).机器人声音仿真

Webots 中的声音仿真主要通过Sound和两种节点来实现。Sound节点用于播放预定义的音频文件,而节点则允许在仿真过程中动态生成和播放声音。这些节点可以用于模拟机器人的语音输出、报警声、环境噪音等。以下是一个示例,展示如何在控制器代码中播放预定义的声音。// 控制器代码(.c) # include <webots/robot.h> # include <webots/sound.h> # define TIME_STEP 64 const char * sound_name = "sound";

kkchenjj的博客 1311

网页无插件流媒体播放器EasyPlayerPro如何二次开发重新封装?

EasyPlayerPro流媒体播放器是青犀(TSINGSEE)团队研发的比较早能支持H.265编码视频的播放器,支持集成在各种流媒体服务器内播放视频。 有位网友在我们的github上接触到了EasyPlayerPro播放器,就想用该播放器为基础,做一个简洁版本的播放器,于是打算重新封装一下,只留下两个接口供调用,一个是传URL用于播放的接口,另一个接口就是抓图接口。 下面简单描述下封装过程: 1、DllImport属性应用于方法,要求最少要提供包含入口点的dll的名称,添加libEasyplay

TSINGSEE青犀视频官方技术博客 591

使用Matlab与V-REP联合仿真

在Matlab中,我们可以使用V-REP提供的远程API(Application Programming Interface)来连接到V-REP仿真环境。为了连接Matlab与V-REP,我们需要在Matlab中添加V-REP的远程API函数库。你可以根据具体的需求编写Matlab脚本来控制V-REP场景中的机器人,并进行系统建模和仿真。一旦成功连接到V-REP,我们可以使用Matlab来控制V-REP场景中的机器人。在本文中,我们将介绍如何使用Matlab与V-REP进行联合仿真,并提供相应的源代码。

HackMasterX的博客 1853

【CicadaPlayer】av_rescale_q 学习:转换PTS和Duration

参考 av_rescale_q()理解 大神时间基准的总结: AVPacket下的pts和dts以AVStream->time_base为单位(数值比较大),时间间隔就是AVStream->time_base。 大神:多种转换的总结 av_rescale_q用于计算Packet的PTS 如: if (pkt->pts != AV_NOPTS_VALUE) { pkt->pts = av_rescale_q(pkt->pts, m

突围 841

easyplayerpro 使用说明_网页无插件流媒体播放器EasyPlayerPro如何二次开发重新封装?...

原标题:网页无插件流媒体播放器EasyPlayerPro如何二次开发重新封装?EasyPlayerPro流媒体播放器是青犀视频(TSINGSEE)团队研发的比较早能支持H.265编码视频的播放器,支持集成在各种流媒体服务器内播放视频。 有位网友在我们的github上接触到了EasyPlayerPro播放器,就想用该播放器为基础,做一个简洁版本的播放器,于是打算重新封装一下,只留下两个接口供调用,一...

weixin_39986171的博客 296

基于Simulink的单级式光伏并网系统MPPT控制仿真

本文基于Simulink平台,详细介绍了单级式光伏并网系统的MPPT控制仿真实现。主要内容包括:1)阐述MPPT作为光伏系统"智能大脑"的核心作用;2)解析单级式系统架构及扰动观察法(P&O)算法原理;3)以10kW户用系统为例,分步骤演示建模过程,包括光伏阵列搭建、P&O控制器实现(含MATLAB代码)、并网控制设计等;4)通过仿真验证系统在光照突变下的动态响应性能,MPPT效率达98.3%。文章还提出了变步长P&O等优化方向,为光伏系统仿真与控制提供实用指导。

xiaoheshang_123的博客 111

稳定、兼容、高效、超低延时RTSP播放器网页web无插件直播流媒体音视频播放器libEasyPlayer-RTSP库接口调用说明

EasyPlayer-RTSP播放器 EasyPlayer-RTSP播放器是一套RTSP专用的播放器,包括有:Windows(支持IE插件,npapi插件)、Android、iOS三个平台,是区别于市面上大部分的通用播放器,EasyPlayer-RTSP系列从2014年初发展至今得到了各行各业(尤其是安防行业)的广泛应用,其主要原因是EasyPlayer-RTSP更加精炼、更加专注,具备非常低的...

音视频流媒体技术 1338

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

easyplayerpro 使用说明_EasyPlayerPro(Windows)流媒体播放器开发之跨语言调用

下面我们来讲解一下关于EasyPlayerPro接口的调用,主要分为C++和C#两种语言,C++也可以基于VC和QT进行开发,C++以VC MFC框架为例进行讲解,C#以Winform框架为例进行讲解。VC开发EasyPlayerPro首先建一个基于MFC Dialog的工程,取名叫EasyPlayerPro,关于界面逻辑的处理过程就不做过多赘述了,大家有兴趣的可以去看EasyPlayerPro项...

weixin_39684495的博客 1765

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C#Winform调用libEasyPlayer总结

经过一天的调试,Winform调用libEasyPlayer播放RTSP流媒体终于差不多了,留下经验,上一篇已经就怎么调用DLL文件说了,本篇主要讲讲C#项目里具体使用API的情况. 代码基本是抄C++的示例项目,没有弄多个窗口,一个窗口测试OK,其它在Winform中也就没问题了. 调试过程中出现的一个重要问题是OpenStream函数中的回调函数问题,传入的委托方法中更新UI控件时必须要I

路过的Blog 1948

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

libEasyPlayer RTSP windows播放器SDK API接口设计说明

概述 libEasyPlayer实现对RTSP直播流进行实时采集和解码显示,稳定,高效,低延时;解码可采用intel硬件解码和软件解码两种方式,能实时进行录像和快照抓图,OSD叠加等功能。 API接口函数定义  int EasyPlayer_Init(); 函数说明: 播放器初始化,播放器使用之前调用; 参数说明:  void EasyPlayer_Releas...

weixin_30916125的博客 293

C/C++ 静态链接库(lib)的三种常用调用方式

C/C++ 项目工程导入 静态链接库的三种常用方式介绍。

Aliven888的博客 2万+

C#如何调用c++静态库(lib)

可以用CLR(新)或者Managed c++(老)将lib封装成managed dll供C#直接调用。将lib封装成native dll,C#中通过DllImport调用dll。将lib封装成native dll, 再用CLR封装native dll成managed dll供C#直接调用。将lib封装为COM,在C#中调用COM。 转载于:https://www.cnblogs....

weixin_30838873的博客 3784

C#调用c++的lib/dll文件

写了一个c++的库,需要拿去给c#的工程用,所以需要把封装一层。 1、直接新建一个c++工程,在工程属性里设置->常规->公共语言运行时支持,改成公共语言运行时支持(/clr) 2、在cpp文件中直接写c#就可以了@TOC 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章...

qq_43238450的博客 4271

RTSP播放器网页无插件直播流媒体播放器EasyPlayer-RTSP播放器运行出现Unable to load DLL错误解决方案

EasyPlayer-RTSP播放器 EasyPlayer-RTSP播放器是一套RTSP专用的播放器,包括有:Windows(支持IE插件,npapi插件)、Android、iOS三个平台,区别于市面上大部分的通用播放器,EasyPlayer-RTSP系列从2014年初发展至今得到了各行各业(尤其是安防行业)的广泛应用。 EasyPlayer-RTSP播放器运行出现Unable to...

TSINGSEE青犀视频官方技术博客 784
上一篇: QTTabBar的批量修改文件时间的插件
下一篇: C#Winform调用libEasyPlayer总结
路过&
博客等级 码龄19年 126粉丝 91原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值