Gstreamer RTSP适用于控制台应用程序,但不适用于Windows服务

问题描述 投票:0回答:1

我有一个Visual Studio项目,它有一个VC ++ .dll项目,以及一个C#控制台应用程序和一个C#服务,它们都使用这个引用VC ++ .dll:

[DllImport("ImagingService.dll")]
public static extern int main();

在控制台应用程序的Main()方法中,我调用.dll的main()方法,一切都按预期工作。

在C#服务项目中,我从main()方法中调用OnStart()方法。如果我所拥有的代码是VC ++应用程序中的return 0,它会按预期返回0。但是,如果我直接从this GitHub复制代码,我会收到如下错误:

System.DllNotFoundException:无法加载DLL“ImagingService.dll”:找不到指定的模块。 (来自HRESULT的异常:0x8007007E)

控制台应用程序正在使用预期的环境变量来查找链接并包含在VC ++应用程序中的GStreamer依赖项,但似乎Windows服务无法找到它们。我知道它找到了ImagingService.dll,因为如果我注释掉GStreamer代码它会起作用。

我是否正确地假设,因为它在控制台应用程序中工作,我的所有包含在C ++应用程序中都是正确的?关于服务如何调用失败的GStreamer dll,还有一些不同之处。

更新:由于对如何设置我的服务存在疑问,我创建了一个简单的解决方案,其中包括基本的C ++ DLL和C#服务以及C#控制台应用程序。控制台工作正常,服务没有。如果有人有兴趣查看它,我已经包含了一个下载链接。

Dropbox solution download

您还需要安装主x64 GStreamer安装程序和此处的x64 Devel软件包:Gstreamer Download

*注意* - 安装主gstreamer-1.0安装程序时,请确保选择安装“在某些国家/地区存在潜在专利问题的受限编解码器”选项。您还需要安装devel包。

对于测试,您可以通过在Media> OpenNetwork Stream文本框中键入以下内容来使用VLC。

RTSP://127.0.0.1:8554 /测试

否则,使用GStreamer安装程序,他们打包运行此命令进行测试:

gst-launch-1.0 rtspsrc location = rtsp://127.0.0.1:8554 / test! rtph264depay! avdec_h264! autovideosink

c# c++ gstreamer
1个回答
0
投票

如果您将C#应用程序设置为“任何CPU”,那么这很可能是您的问题。如果您的C#应用​​程序启动是x64应用程序,那么ImagingService.dll必须是x64 dll,如果您的应用程序作为x86应用程序启动,则ImagingService.dll必须是x86 dll。

我会将C#应用程序限制为一种架构类型。您可以在“平台目标”属性的C#项目属性构建选项卡中更改此设置,并且(我会假设)将其设置为x86类型。

如果体系结构正确,则无法加载ImagingService.dll,因为它无法加载/查找dll和/或它可以加载/查找ImagingService.dll所依赖的任何依赖dll。这可能是路径问题或DLL加载路径问题。

更新:在您的情况下,问题是您的DLL静态和动态加载来自“gstreamer”安装的DLL。因此必须能够加载所有这些DLL。

我假设控制台版本有效,因为gstreamer安装路径在USER路径设置中,而服务没有,因为它不是因为你没有得到你做的例外。

所以有3种可能的方法来解决这些基本上都是一个解决方案:将gstreamer dll添加到DLL加载路径。

  1. 将gstreamer路径添加到服务用户可以找到它们的全局路径。
  2. 将所需的dll添加到已安装的目录中。
  3. 更改C#和/或C ++以手动将gstreamer安装路径添加到dll加载路径。

1和2简单,不需要任何代码更改。 3.要求更改代码。

对于C ++ DLL,您可以执行以下操作:

  • 设置延迟加载dll静态要求的所有gstream dll(项目属性/链接器/输入/延迟加载的Dll)
  • 将gstreamer路径添加到dll加载路径(这可能来自您的应用程序配置或C#组件)。 因此,在调用任何gstreamer API之前,您需要添加以下内容: SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS); AddDllDirectory(L “C:\的GStreamer \ 1.0 \ x86_64的\ BIN”);
© www.soinside.com 2019 - 2024. All rights reserved.