虽然我已经阅读了几种使用 Powershell 更改音量的解决方案:
我找不到任何可以改变平衡的东西。比如:
#Sets left channel volume to 20%
Set-Speaker -LeftChannel 20
#Sets right channel volume to 80%
Set-Speaker -RightChannel 80
为了明确起见,我正在讨论修改此内容:
我需要它来设置一个启动脚本,以保持我当前(或最后)的音量,但使左声道始终保持在 20%
谢谢
将 zett42 的功能性想法集合和最后的一个小错误,实际上将其组合成一个更像食谱风格的答案:
AudioManager.cs
中AudioManager.cs
文件中,通过替换以下行,制作 GetMasterVolumeObject()
public
,以便从辅助类中使用更方便:private static IAudioEndpointVolume GetMasterVolumeObject()
与
public static IAudioEndpointVolume GetMasterVolumeObject()
Add-Type -TypeDefinition $(
$(Get-Content -Path "AudioManager.cs" -Raw) +
@'
public static class AudioSettings {
public static void SetChannelVolumeLevel(uint channelNumber, float newLevel)
{
VideoPlayerController.IAudioEndpointVolume masterVol = null;
try
{
masterVol = VideoPlayerController.AudioManager.GetMasterVolumeObject();
if (masterVol == null)
return;
masterVol.SetChannelVolumeLevelScalar(channelNumber, newLevel/100, Guid.Empty);
}
finally
{
if (masterVol != null)
Marshal.ReleaseComObject(masterVol);
}
}
}
'@)
[AudioSettings]::SetChannelVolumeLevel(0, 60)
[AudioSettings]::SetChannelVolumeLevel(1, 40)
正如here所解释的,您需要调用
SetChannelVolumeLevel
或SetChannelVolumeLevelScalar
的IAudioEndpointVolume
方法。互操作方法包含在this Gist中,但缺少方便的包装方法。
首先,您需要使用
Add-Type
在 PowerShell 中包含 C# 代码:
Add-Type -TypeDefinition @'
-paste C# code here-
'@
将此方法添加到类中
AudioManager
:
/// <summary>
/// Sets the channel volume to a specific level
/// </summary>
/// <param name="channelNumber">Channel number, which can be 0..(numberOfChannels-1)</param>
/// <param name="newLevel">Value between 0 and 100 indicating the desired scalar value of the volume</param>
public static void SetChannelVolumeLevel(uint channelNumber, float newLevel)
{
IAudioEndpointVolume masterVol = null;
try
{
masterVol = GetMasterVolumeObject();
if (masterVol == null)
return;
masterVol.SetChannelVolumeLevelScalar(channelNumber, newLevel/100, Guid.Empty);
}
finally
{
if (masterVol != null)
Marshal.ReleaseComObject(masterVol);
}
}
我已将其插入到第
private static IAudioEndpointVolume GetMasterVolumeObject()
行之前,但将其放在类中的哪个位置并不重要。
现在您可以像这样从 PowerShell 调用它:
[VideoPlayerController.AudioManager]::SetChannelVolumeLevelScalar(0, 60)
[VideoPlayerController.AudioManager]::SetChannelVolumeLevelScalar(1, 40)
在我的系统上,它会均匀地移动左右音量,但我可能会遇到平衡锁定的问题。有一个注册表调整描述在这里但对我不起作用。