媒体播放器作为Windows服务

时间:2014-02-17 12:00:34

标签: windows delphi audio service delphi-xe3

我一直在寻找信息一段时间,但一直找不到对我们有用的东西。 我们正在构建一种SmartCar复杂系统,它可以控制汽车中的所有东西..它是一个开发项目,没有什么“重新发明轮子”,只是从头开始完成它。

由于它将承受相当大的负担,我们在Intel的S335 SSD硬盘驱动器上运行Windows Server 2012 Datacenter,构建了一台基于i5 proc和8GB内存的PC。

到目前为止一切顺利,主要控制器作为服务运行,并且对锁定/解锁,侧镜移动,窗户移动,完整的气候控制,点火,灯等操作反应良好......但是,我们有点可以不能发出声音......

我们使用all作为服务的原因是因为它根本没有监视器,而是通过WiFi和3G与Android平板电脑和手机以及Windows平板电脑进行通信。我们尝试通过远程桌面连接来实现,但是双方都浪费资源,所以我们宁愿使用Tcp / ip客户端/服务器版本。此外,由于它需要休眠/关闭以免浪费能源,因此即时开机至关重要,无需登录即可在几秒钟内完成所有工作,这是完美的。

所以,我的问题是,我怎么能让音乐播放器作为服务运行并播放音频文件,我们通过我们的remore应用程序选择? 远程部分不是问题,而是播放器部分。我已经尝试了几个delphi演示音乐播放器示例代码转换为服务,但他们的nome发挥了声音。我想这与通常不允许与用户界面直接交互的服务有关,但我知道这是可能的,只是不知道如何。

另外,我猜它不可能,但仍然值得一提:如果我们想扩展它以用作视频播放器,这可以在没有任何用户登录的情况下完成吗?比如连接vga / dvi视频监视器,但只在选择播放时显示视频? (在这种情况下,监视器将作为扩展监视器,因此不会显示任何登录信息)。

我在Delphi中创建所有服务。任何信息,将不胜感激。感谢。

3 个答案:

答案 0 :(得分:2)

音频API在服务中运行良好(只是为了确保因为存在一些令人困惑的问题:服务我指的是用户模式服务进程,它与内核模式驱动程序无关),就像它们执行它一样互动环节。具体来说,您可以打开默认端点设备进行音频呈现(IMMDeviceEnumerator::GetDefaultAudioEndpointIAudioClient::Initialize)并发送数据以进行回放(IAudioRenderClient::GetBuffer)。我不希望像DirectShow这样的其他API在服务的音频输出中受到限制。

视频设备有一个不同的故事:标准视频呈现最终发生在您无法访问服务的桌面上。要在没有明确用户登录的情况下运行系统上的桌面视频,您可能更喜欢设计常规应用程序并将Windows设置为自动登录并自动启动应用程序。如果你喜欢使用某种外部视频输出(Intensity Pro板上的HDMI视频输出 - 只是一个例子),这应该是从服务开始 - 这个视频输出不需要桌面。

要控制服务应用程序,您需要实现一些接受外部命令的东西。这可以是Web服务器,也可以是在套接字上侦听并响应传入数据的内容。如果要从另一个进程(例如交互式)控制服务,只需从服务中将COM接口放在运行对象表上,然后从应用程序中获取它以调用其方法。

更新:这是some sample code证明来自服务的音频操作。它假设默认混音格式为32位浮点音频,并向默认音频输出设备发出5秒高频信号。

  • PlayService.exe / regserver - 注册以app
  • 运行
  • cscript PlayService_Play.js - 在.exe中启动代码并播放声音
  • PlayService.exe / service - 重新注册以作为服务运行
  • cscript PlayService_Play.js - 播放来自服务的相同声音
  • PlayService.exe / unregserver - 取消注册并清理

This code block显示使用的API(C ++代码)。

答案 1 :(得分:2)

Windows Embedded Automotive 7提供音频和视频支持,可以部署在x86或ARM

答案 2 :(得分:1)

我知道你的两个问题的解决方案,但它有点讨厌。 (此时我想指出,对于初学者来说,我不会做我在这里提出的建议,只提供了不可行的解决方案。没有“这是一个可怕的建议”需要评论 - 我已经知道。)


关于我的解决方案:如果您希望使用音频或视频设备在用户界面之外工作,可以通过自定义内核模式驱动程序实现。内核模式驱动程序可以直接与Windows服务通信,并可以访问设备中的所有硬件组件。但是,如果你想利用这样的解决方案,你将不得不处理一些洞穴:

  • 你不能使用Pascal来创建Windows驱动程序(至少不是一个可靠的驱动程序,可能有开源DDK基于Pascal,但我不知道任何)。如果你想创建一个Windows驱动程序,你将不得不使用WDK(几乎与强大的IDE一起使用,如MSVS)。
  • 您将对计算机的软件环境进行有限访问。 (更难阅读注册表,更复杂的内存预留等。)
  • 写一个Windows驱动程序是一件很糟糕的工作。我做了几次,我不希望我的死敌。 (有无意义的约定,过时的数据类型,未记录的功能......等等。)
  • 没有巨大的组件和API库来帮助您创建驱动程序。在第0圈,你完全几乎
  • 如果Windows内核驱动程序有错误,则不会抛出异常或正常失败。它会产生BSOD错误,您必须重置系统才能再次控制它。

<强>更新

  • 我的一位开源行业的朋友告诉我,有 一种使用项目Lazarus定位内核模式驱动程序的方法。
  • 一些进一步的研究表明,过滤器驱动程序可能也有助于OP 带着他的烦恼。 (并且过滤器驱动程序在ring-0 中不存在。)