如何检测Windows XP机器上是不是播放任何声音

Posted

技术标签:

【中文标题】如何检测Windows XP机器上是不是播放任何声音【英文标题】:How to detect if any sound plays on a windows xp machine如何检测Windows XP机器上是否播放任何声音 【发布时间】:2010-10-21 00:48:35 【问题描述】:

是否可以检测 windows xp 机器上是否播放任何声音?任何语言的帮助都会很有用。我基本上需要编写一个始终运行的程序,并在播放声音时将一些文本输出到文件中。我不需要关于声音的任何具体信息,只需要声音是否正在播放。我不在乎扬声器是否真的打开了电源或类似的东西。

【问题讨论】:

【参考方案1】:

问题很简单,但答案很难。您需要利用 DirectSound 来实现您的目的。我还没有测试我的解决方案,但是你可以尝试调用IDirectSoundBuffer8::GetStatus(),然后检查pdwStatus参数的返回值。根据 MSDN,如果正在听到缓冲区,则设置 DSBSTATUS_PLAYING

由于您没有告诉您正在使用的编程语言,我使用我最喜欢的语言 Delphi 来实现以下示例。

  var
    dwStatus: DWORD;
    hResult: HRESULT;

  hResult := GetStatus(@dwStatus);
  if hResult = DS_OK then begin
    if dwStatus and DSBSTATUS_PLAYING <> 0 then
      ShowMessage('Sound card is playing sound now.');
  end;

更新

我刚刚找到一个讨论how to detect silence的VB论坛(没有声卡输出)。下载DetSilence.zip。在DXRecord_GotWavData Sub 中,将常量SilencePercentNonSilencePercent 修改为您需要的值。

【讨论】:

@saberworks,我建议您考虑在 ***.com 注册,因为这样做,许多专家可能有兴趣深入研究您的问题。请反馈解决方案是否有效。 感谢 Vantomex。我沿着这条路走,但我认为我做错了,因为我只能得到它给我正在播放的声音的状态,而不是“卡上的任何声音”。我想出了一个不同的解决方案,我将在单独的消息中发布。【参考方案2】:

我最终以一种非常规的方式解决了这个问题。首先,我安装了虚拟音频电缆 (http://www.ntonyx.com/vac.htm) 并将其配置为我的主要声音设备。然后我将录音设备配置为录制来自主输出设备的声音。这基本上意味着我可以点击“记录”,它会记录任何进入声卡的内容。然后我使用 perl 模块 Win32::SoundRec 将声音录制到文件中。我定期检查 wav 文件的活动,如果有,我知道正在播放声音。我使用另一个 perl 模块 Audio::Wav 来解析 WAV 文件并查找活动(静默与非静默)。

【讨论】:

感谢您的反馈以及您愿意发布有效的解决方案。顺便说一句,我刚刚发现一个 VB 论坛讨论了如何检测静音(声卡没有输出)。我已更新我的答案以包含论坛链接。

以上是关于如何检测Windows XP机器上是不是播放任何声音的主要内容,如果未能解决你的问题,请参考以下文章

如何检测其他应用程序的音频是不是在后台播放? (UWP,Windows 10)

您如何检测 Phaser 中是不是正在播放任何音乐?

禁用 Windows XP 文件缓存

在 windows xp 中检测到 Internet 连接后如何启动 vbs 脚本? [关闭]

如何使用 .NET C/C++/C# 检测该视频是不是在播放器中打开?

如何在同一个 Windows XP 机器上同时运行 python 2.6 和 3.0?