我一直在寻找信息一段时间,但一直找不到对我们有用的东西。 我们正在构建一种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中创建所有服务。任何信息,将不胜感激。感谢。
答案 0 :(得分:2)
音频API在服务中运行良好(只是为了确保因为存在一些令人困惑的问题:服务我指的是用户模式服务进程,它与内核模式驱动程序无关),就像它们执行它一样互动环节。具体来说,您可以打开默认端点设备进行音频呈现(IMMDeviceEnumerator::GetDefaultAudioEndpoint
,IAudioClient::Initialize
)并发送数据以进行回放(IAudioRenderClient::GetBuffer
)。我不希望像DirectShow这样的其他API在服务的音频输出中受到限制。
视频设备有一个不同的故事:标准视频呈现最终发生在您无法访问服务的桌面上。要在没有明确用户登录的情况下运行系统上的桌面视频,您可能更喜欢设计常规应用程序并将Windows设置为自动登录并自动启动应用程序。如果你喜欢使用某种外部视频输出(Intensity Pro板上的HDMI视频输出 - 只是一个例子),这应该是从服务开始 - 这个视频输出不需要桌面。
要控制服务应用程序,您需要实现一些接受外部命令的东西。这可以是Web服务器,也可以是在套接字上侦听并响应传入数据的内容。如果要从另一个进程(例如交互式)控制服务,只需从服务中将COM接口放在运行对象表上,然后从应用程序中获取它以调用其方法。
更新:这是some sample code证明来自服务的音频操作。它假设默认混音格式为32位浮点音频,并向默认音频输出设备发出5秒高频信号。
This code block显示使用的API(C ++代码)。
答案 1 :(得分:2)
Windows Embedded Automotive 7提供音频和视频支持,可以部署在x86或ARM
上答案 2 :(得分:1)
我知道你的两个问题的解决方案,但它有点讨厌。 (此时我想指出,对于初学者来说,我不会做我在这里提出的建议,只提供了不可行的解决方案。没有“这是一个可怕的建议”需要评论 - 我已经知道。)
关于我的解决方案:如果您希望使用音频或视频设备在用户界面之外工作,可以通过自定义内核模式驱动程序实现。内核模式驱动程序可以直接与Windows服务通信,并可以访问设备中的所有硬件组件。但是,如果你想利用这样的解决方案,你将不得不处理一些洞穴:
<强>更新强>