V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JCZ2MkKb5S8ZX9pq
V2EX  ›  Windows

怎么知道 Windows 电脑当前是否有声音输出?

  •  
  •   JCZ2MkKb5S8ZX9pq · 2020-06-06 17:40:58 +08:00 · 1453 次点击
    这是一个创建于 1639 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 在用 Home Assistant

    • Windows 通过 HDMI 输出声音画面到功放

    • 功放本来是常年不关的,但是感觉发热很厉害,即便无声的时候应该功耗还是在(毕竟画面还是镜像过来了)。

    • 考虑做一个功能,如果 windwos 持续五分钟没有声音输出,切换状态为无声,且立刻关闭功放。如果有声音,状态恢复,开启功放。

    • 现在的问题就是怎么获取到 windows 有声音输出这个状态。特别是合成之后的。比如图中把系统声音关了,那系统声音不要激活功放。

    t6o854.png

    • 总结一下,就是:需要 通过代码方式 获得 RX-V465 这个总的 声音输出状态

    • 因为现在功放实现的思路是,PC 通过 HDMI 输出画面和音频到功放,功放输出到环绕和投影。但因为投影仪没开的时候看不到功放的画面,仅能获取到显示器上的,所以功放得到的画面是显示器的镜像。
    • HDMI 必须同时输出画面和声音,所以即使静音的时候,功放还是在接收画面(不知道它有没有做什么处理,但是很热)。
    • 所以另一个思路是 PC 无声的时候,取消屏幕镜像(如果这样可以减低发热的话)。这样就跟 HA 无关了,直接在 windows 下运行一个小代码就好了。
    第 1 条附言  ·  2020-06-09 17:07:37 +08:00
    6 条回复    2020-06-23 14:27:30 +08:00
    JCZ2MkKb5S8ZX9pq
        1
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-06-06 18:21:42 +08:00
    试着停止画面输出半个多小时(断开此显示器的连接),温度完全没降,看来是功放本身比较老,没有类似休眠的设定。后一个思路不行了,还是要通过 HA 红外关功放好了。
    JCZ2MkKb5S8ZX9pq
        2
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-06-07 02:01:13 +08:00
    搜到一个关联的问题 [perl - How to detect if any sound plays on a windows xp machine - Stack Overflow]( https://stackoverflow.com/questions/3983463/how-to-detect-if-any-sound-plays-on-a-windows-xp-machine)

    但是这里的大哥用的是 Delphi,VB 的我也不知道咋弄。

    思路应该是这个 [IDirectSoundBuffer8::GetStatus Method | Microsoft Docs]( https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ee418070(v=vs.85)?redirectedfrom=MSDN)

    请问用 python 或者命令行怎么读取这个 `DSBSTATUS_PLAYING`?
    JCZ2MkKb5S8ZX9pq
        3
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-06-07 02:02:48 +08:00
    还有这个大哥写的,也不知道怎么用这个代码。

    [.net - Determine if windows is currently playing sound - Stack Overflow]( https://stackoverflow.com/questions/45422255/determine-if-windows-is-currently-playing-sound)
    JCZ2MkKb5S8ZX9pq
        4
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-06-07 02:52:12 +08:00
    失败,DSBSTATUS_PLAYING 不行。

    import win32com.directsound.directsound as ds

    print(f'{ds.DSBSTATUS_BUFFERLOST = }')
    print(f'{ds.DSBSTATUS_LOOPING = }')
    print(f'{ds.DSBSTATUS_PLAYING = }')

    ds.DSBSTATUS_BUFFERLOST = 2
    ds.DSBSTATUS_LOOPING = 4
    ds.DSBSTATUS_PLAYING = 1

    一直是这三个值,可能就是某种常量,不是当前状态。
    ysc3839
        5
    ysc3839  
       2020-06-09 00:01:49 +08:00
    https://www.v2ex.com/t/679678
    本来想建议你不应该开一个新帖子,可以使用 Append 功能,但是发现这个帖子没人回复。
    估计是发到了比较冷门的区,似乎也没在主页上出现,不知道是不是 V2EX 的 bug ?还是有一定规则决定是否显示的?
    JCZ2MkKb5S8ZX9pq
        6
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-06-23 14:27:30 +08:00
    @ysc3839 追加请教一个问题。

    我用 potplayer 看电影的时候,有些音源,比如 DTS/AC3 是 passthough 直出的,也就是从 windows 的音量合成器里是看不到波形的,而功放也是直接接收到的数据 DTS/AC3 类型。

    所以在这个情况下,要摸索出如何判断 windows 是否有发声,可能比较困难。我连肉眼查看都不知道在哪儿查看。

    换一个思路,有什么办法能获取到 potplayer 当前的播放 /停止状态吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2618 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:57 · PVG 18:57 · LAX 02:57 · JFK 05:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.