从 powershell 更改音频音量的平衡级别?

问题描述 投票:0回答:2

虽然我已经阅读了几种使用 Powershell 更改音量的解决方案:

如何从 PowerShell 静音/取消静音

从 powershell 更改音频级别?

我找不到任何可以改变平衡的东西。比如:

#Sets left channel volume to 20%
Set-Speaker -LeftChannel 20

#Sets right channel volume to 80%
Set-Speaker -RightChannel 80

为了明确起见,我正在讨论修改此内容:

enter image description here

我需要它来设置一个启动脚本,以保持我当前(或最后)的音量,但使左声道始终保持在 20%

谢谢

windows powershell audio volume
2个回答
2
投票

将 zett42 的功能性想法集合和最后的一个小错误,实际上将其组合成一个更像食谱风格的答案:

  1. AudioManager.cs gist 获取代码并将其放入脚本所在的文件
    AudioManager.cs
  2. 在该
    AudioManager.cs
    文件中,通过替换以下行,制作
    GetMasterVolumeObject()
    public
    ,以便从辅助类中使用更方便:
private static IAudioEndpointVolume GetMasterVolumeObject()

public static IAudioEndpointVolume GetMasterVolumeObject()
  1. 现在在您的 PowerShell 脚本中您可以执行以下操作:
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)

0
投票

正如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)

在我的系统上,它会均匀地移动左右音量,但我可能会遇到平衡锁定的问题。有一个注册表调整描述在这里但对我不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.