媒体播放器作为 Windows 服务

Posted

技术标签:

【中文标题】媒体播放器作为 Windows 服务【英文标题】:Media player as windows service 【发布时间】:2014-02-17 12:00:34 【问题描述】:

我一直在寻找信息已有一段时间了,但找不到任何对我们有用的信息。 我们正在构建一种 SmartCar 复杂系统,它或多或少地控制汽车中的所有东西。它是一个开发项目,这里没有“重新发明***”,只是完全从头开始。

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

到目前为止一切顺利,主控制器作为服务运行,并且对锁定/解锁、后视镜移动、车窗移动、完整的气候控制、点火、灯光等操作都做出了很好的响应......但是,我们可以不能从中播放声音...

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

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

另外,我想这是不可能的,但仍然值得一问:如果我们想将其扩展为也用作视频播放器,是否可以在没有任何用户登录的情况下完成?例如连接了 vga/dvi 视频监视器,但仅在选择播放视频时才显示视频? (在这种情况下,监视器将作为扩展监视器,因此永远不会显示登录界面)。

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

【问题讨论】:

我认为音频或视频不会从会话 0 开始工作 @Marc,你试过Windows Core Audio API 吗? 它在斯洛文尼亚,如果你想知道我们这些白痴住在哪里... ;) 我会用外部设备解决这类问题。有一个通过 USB/RS232/Lan 或类似的东西控制的外部声音设备,与视频相同。我绝对不想在控制汽车部件的东西上乱七八糟。一个错误,你会崩溃窗口,一切都停止工作。 @JustMarc 让我担心的不是点火。锁和窗户同样具有毁灭性。车出事故了,你不能开门出去,因为窗户已经坏了。不过,我理解您对问题的解决方案。仍然不确定我是否信任 Windows 与我的汽车 :) 【参考方案1】:

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

【讨论】:

感谢这个!我会尽快检查并深入研究文档! :O【参考方案2】:

音频 API 在服务中运行良好(只是为了确保因为周围有些混乱:服务是指用户模式服务进程,与内核模式驱动程序无关),就像它们在互动环节。具体来说,您可以打开默认端点设备进行音频渲染(IMMDeviceEnumerator::GetDefaultAudioEndpointIAudioClient::Initialize)并发送数据进行播放(IAudioRenderClient::GetBuffer)。我不希望 DirectShow 等其他 API 在服务的部分音频输出方面受到限制。

视频设备的情况有所不同:标准视频渲染最终会在桌面上进行,而您的服务无法访问。要在没有显式用户登录的情况下在系统上运行桌面视频,您可能更喜欢设计一个常规应用程序并将 Windows 设置为自动登录并自动启动您的应用程序。但是,如果您更喜欢使用某种外部视频输出(Intensity Pro 板上的 HDMI 视频输出 - 只是一个示例),这应该可以在服务中工作 - 此视频输出不需要桌面。

要控制服务应用程序,您需要实现一些东西来接受外部命令。这可以是 Web 服务器,也可以是侦听套接字并响应传入数据的其他东西。如果你想从另一个进程控制服务,比如交互,你可以简单地在服务的运行对象表上放一个 COM 接口,然后从应用程序中抓取它来调用它的方法。

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

PlayService.exe /regserver - 注册为应用程序运行 cscript PlayService_Play.js - 在 .exe 中启动代码并播放声音 PlayService.exe /service - 重新注册以作为服务运行 cscript PlayService_Play.js - 从服务中播放相同的声音 PlayService.exe /unregserver - 取消注册并清理内容

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

【讨论】:

感谢您的提示。我仍然需要检查该音频 api 及其实现......至于视频:所以你说有一种方法可以在没有用户登录的情况下将视频播放到外接显示器,如果我不需要通过视频卡进行的任何桌面交互(我没有,只是视频输出......)?但是,它是否需要是外部卡,例如您提到的那个(Intensity pro),还是可以通过内部显卡上的第二个输出来完成(内部但不是集成的,我的意思是......)以及? 哦,至于控件 - 已经解决并且正在工作,通过控制应用程序和服务本身之间的 tcp/ip 服务器/客户端连接... :) 我有点希望我可以全部从主进程(服务)运行,并尽可能避免服务到服务的交互通信...... 是的,显卡输出是服务操作的好机会,无需额外硬件。 示例代码的链接似乎已经死了......:/我已经尝试了几个小时。你碰巧在别的地方也有它……? :) 没关系,它现在似乎可以工作了。全部下载了,但是,地狱,无法弄清楚代码中发生了什么......我的 C++ 知识是纯零...... -.-【参考方案3】:

我知道你的两个问题的解决方案,但它有点讨厌。 (在这一点上,我想指出,对于初学者来说,我不会按照我在这里的建议去做,只是没有提供更多可行的解决方案。不需要“这是一个糟糕的建议”cmets - 我已经知道这一点。)


关于我的解决方案:如果您希望使用音频或视频设备在用户界面之外工作,可以通过定制的内核模式驱动程序来实现。内核模式驱动程序可以直接与 Windows 服务通信,并可以访问设备中的所有硬件组件。但是,如果您希望使用此类解决方案,则必须处理一些注意事项:

你不能使用 Pascal 来创建 Windows 驱动程序(至少不是一个可靠的驱动程序,可能有基于 Pascal 的开源 DDK,但我不知道)。如果您想创建 Windows 驱动程序,则必须使用 WDK(实际上与 MSVS 等功能强大的 IDE 一起使用)。 您将有限地访问您计算机的软件环境。 (更难读取注册表,更复杂的内存预留等) 编写 Windows 驱动程序是一项艰巨的工作。 我做过几次,我不希望我的死敌这样做。 (有毫无意义的约定、过时的数据类型、未充分记录的功能……等等。) 没有庞大的组件和 API 库来帮助您创建驱动程序。在环 0 上,您几乎完全靠自己。 如果 Windows 内核驱动程序有问题,它不会抛出异常或优雅地失败。它会造成 BSOD 错误,您必须重置系统才能再次控制它。

更新:

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

【讨论】:

它似乎没有任何其他驱动程序是可能的。 ***.com/questions/2143439/… @JustMarc 你询问了音频和视频 @JustMarc Mkey。我没有“说”我的解决方案是唯一的,或者是最好的。我只说这是一个可行的解决方案,其他的我不知道。 @mg30rg 我知道。我只是指出,您的解决方案是最后的选择- 艰难的方式... :) 当然,感谢您的回答。但我真的不想写驱动程序.. 甚至不接近那个知识;)

以上是关于媒体播放器作为 Windows 服务的主要内容,如果未能解决你的问题,请参考以下文章

如何将资源文件夹中的路径与 Windows 媒体播放器一起使用

Live555流媒体服务器编译(Windows下)

用REALPLAYER或WINDOWS媒体播放器看的电影能下载到电脑看吗?

Windows环境搭建Red5流媒体服务器

Windows流媒体怎么关闭。

使用 ffmpeg 实时流式传输 MPEG-TS 和 windows 媒体服务