小编Fat*_*Hit的帖子

设置音频端点设备应用特定(以编程方式)

链接到"反馈中心" 的错误报告


音频端点设备(此处称为"端点")是物理或虚拟音频输出或输入设备.


在Windows 10 April Update 1803中,引入了早该应用的"应用程序卷和设备首选项".这些设置允许更多地控制音频流管理,因为现在可以为不同的应用程序设置不同的端点,无论该特定应用程序是否带有端点选择.

但是,有一个问题是程序的音频(其端点是非默认的)在关闭并再次启动后通过默认端点(或根本不是)流式传输,尽管端点在设置中正确显示:

问题娱乐

据我所知,可以在具有任何虚拟或物理端点和受影响程序的Windows 10计算机(版本1803或更高版本)上重新创建该问题.我在这个例子中使用了"VLC媒体播放器"(忽略了它带有端点选择的事实),因为它是众所周知的并且可以广泛访问,这样可以更容易地重新创建问题.


我在寻找什么......

...是一种在端点之间切换的编程解决方案,理想情况下可以以脚本的形式启动,以通过应用程序启动设置正确的端点.

为了我的目的,只需手动调整设备实例路径就足够了,因为设备总是一样的,但我也不会抱怨从注册表中检索设备实例路径的解决方案.

  • 可以从密钥的子密钥中检索定义的端点和它们正在使用的设备的设备实例路径HKEY_USERS\# YOUR SID #\Software\Microsoft\Multimedia\Audio\DefaultEndpoint.我不知道windows如何生成子项的名称或它们可以在哪里找到.如果我不得不疯狂猜测,我会说这些是应用程序ID(如果我错了,请随时纠正我).
  • 设备管理器中可以找到设备实例路径(在"音频输入和输出"下双击所需的设备,导航到"详细信息"选项卡,然后从"属性"下拉菜单中选择"设备实例路径") .
  • 此外,Microsoft Docs中有关音频端点设备流管理的条目可能会有所帮助,但这远远超出我的想象.

一个可能但不切实际的解决方法......

...将为应用程序手动设置另一个端点,并在每次启动所述应用程序时切换回所需的端点(如上所示).

但是,不是每次启动都至少需要10秒,你甚至可能忘记这样做,因为音频可能只是通过默认端点流式传输.

后者的替代方案是,根本不会传输音频,或者在某些情况下它实际上是有效的.

例如:VLC媒体播放器,Tom Clancy的Rainbow Six Siege(虽然在启动画面期间音频将正确流式传输)

例如:使命召唤4:现代战争,使命召唤:现代战争2,使命召唤:现代战争3

例如:Window Media Player,Microsoft Edge,Firefox

意见

  • VLC Media Player附带端点选择,但TeamSpeak 3也是如此,与VLC不同,它完全跳过Windows设置.
  • "使命召唤"不会流式传输任何音频,因为我没有遇到任何其他类似的应用程序.
  • Windows Media Player,Microsoft Edge和Firefox是目前唯一可以正常运行的程序(我测试过).他们没有端点选择(我知道),并将在关闭并再次启动后使用正确的端点.但应注意,在调整端点时,Firefox和Microsoft Edge将在"应用程序卷和设备首选项"中显示多个实例.

放弃

我已经尝试了两个第三方软件:"音频路由器",它根本不起作用和"CheVolume",它不能解决问题并且在这样做时不断崩溃.

这个问题基于我在超级用户(这里)询问过的问题,由于我对实际编程缺乏了解,我无法得到答案(我对Batch和PowerShell只有一点熟悉) ).我很清楚,Stack Overflow和Super User都不是脚本编写服务,但是,这个问题没有得到Windows 10 10月更新1809的解决,我认为这是一个不仅影响我的问题,而且会影响我在我之后帮助多个人.如果您对此有不同看法,请随意撰写评论或提出修改建议.

我也不确定标签的"音频流"和"端点"是否应该在这种情况下使用,如果它们不应该或者你能想到更好的话,请提出编辑.



编辑 - 05/11/18

使用第三方软件'EarTrumpet'我能够克服"使命召唤"游戏的问题(重启后根本没有音频),但是,在我指定非默认端点后,"VLC媒体播放器"不会重启用'EarTrumpet'直到我再次关闭'EarTrumpet'并且'Tom Clancy的Rainbow Six Siege'的问题仍然存在. …

c++ audio endpoint audio-streaming windows-10

19
推荐指数
1
解决办法
917
查看次数

Where-Object 的意外行为

我刚刚遇到了一个意想不到的行为,Where-Object我找不到任何解释:

$foo = $null | Where-Object {$false}
$foo -eq $null
> True


($null, 1 | Measure-Object).Count
> 1

($foo, 1 | Measure-Object).Count
> 1


($null, $null, 1 | Measure-Object).Count
> 1

($foo, $foo, 1 | Measure-Object).Count
> 0
Run Code Online (Sandbox Code Playgroud)

如果 的条件Where-Object为假,$foo则应该为$null(这看起来是正确的)。

然而,$foo在任何值进入管道之前至少进行两次管道传输似乎会破坏它。

是什么原因造成的?


其他不一致之处:

($foo, $null, 1 | Measure-Object).Count
> 1

($foo, $null, $foo, 1 | Measure-Object).Count
> 0

($null, $foo, $null, 1 | Measure-Object).Count
> 1

($foo, 1, $foo, $foo …
Run Code Online (Sandbox Code Playgroud)

powershell

4
推荐指数
1
解决办法
754
查看次数

为什么 pwsh.exe 与 Start-Process 结合使用时不直接接受脚本块?

为什么Start-Process powershell.exe { Read-Host }有效,但Start-Process pwsh.exe { Read-Host }不起作用?

我知道 的-ArgumentList切换Start-Process,但是当涉及转义引号时,它使事情变得更加复杂:

PowerShell 7.0.3 和 7.2.0-preview.3:

Start-Process pwsh.exe -ArgumentList '-Command "& {
    ''Hello World.''
    Read-Host
}"' -Verb RunAs
Run Code Online (Sandbox Code Playgroud)

PowerShell 5.1:

Start-Process powershell.exe { 
    'Hello World.'
    Read-Host
} -Verb RunAs
Run Code Online (Sandbox Code Playgroud)

另一方面,当创建新的 PowerShell 会话(不带Start-Process)时,仍然可以使用脚本块:

pwsh.exe {
    'Hello World.'
    Read-Host
}
Run Code Online (Sandbox Code Playgroud)

我在这里遗漏了一些东西还是有更好/不同的方法允许脚本块与脚本的其余部分并行执行?

powershell start-process scriptblock powershell-core powershell-7.0

2
推荐指数
2
解决办法
2903
查看次数