如何通过 PowerShell 将声音静音/取消静音

发布于 2024-07-08 09:52:50 字数 421 浏览 10 评论 0原文

尝试编写一个 PowerShell cmdlet,该命令将在开始时将声音静音(除非已经静音),并在结束时取消静音(仅当开始时未静音)。 找不到任何我可以使用的 PoweShell 或 WMI 对象。 我正在尝试使用 Win32 函数,例如 auxGetVolumeauxSetVolume,但无法完全实现工作(如何从 IntPtr 读取值?)。

我正在使用 V2 CTP2。 大家有什么想法吗?

谢谢!

Trying to write a PowerShell cmdlet that will mute the sound at start, unless already muted, and un-mute it at the end (only if it wasn't muted to begin with).
Couldn't find any PoweShell or WMI object I could use. I was toying with using Win32 functions like auxGetVolume or auxSetVolume, but couldn't quite get it to work (how to read the values from an IntPtr?).

I'm using V2 CTP2. Any ideas folks?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(13

李白 2024-07-15 09:52:50

从 Vista 开始,您必须使用 核心音频API来控制系统音量。 它是一个 COM API,不支持自动化,因此需要使用 .NET 和 PowerShell 中的大量样板文件。

无论如何,下面的代码允许您从 PowerShell 访问 [Audio]::Volume[Audio]::Mute 属性。 这也适用于可能有用的远程计算机。 只需将代码复制粘贴到 PowerShell 窗口中即可。

Add-Type -TypeDefinition @'
using System.Runtime.InteropServices;

[Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IAudioEndpointVolume {
  // f(), g(), ... are unused COM method slots. Define these if you care
  int f(); int g(); int h(); int i();
  int SetMasterVolumeLevelScalar(float fLevel, System.Guid pguidEventContext);
  int j();
  int GetMasterVolumeLevelScalar(out float pfLevel);
  int k(); int l(); int m(); int n();
  int SetMute([MarshalAs(UnmanagedType.Bool)] bool bMute, System.Guid pguidEventContext);
  int GetMute(out bool pbMute);
}
[Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDevice {
  int Activate(ref System.Guid id, int clsCtx, int activationParams, out IAudioEndpointVolume aev);
}
[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDeviceEnumerator {
  int f(); // Unused
  int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice endpoint);
}
[ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] class MMDeviceEnumeratorComObject { }

public class Audio {
  static IAudioEndpointVolume Vol() {
    var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator;
    IMMDevice dev = null;
    Marshal.ThrowExceptionForHR(enumerator.GetDefaultAudioEndpoint(/*eRender*/ 0, /*eMultimedia*/ 1, out dev));
    IAudioEndpointVolume epv = null;
    var epvid = typeof(IAudioEndpointVolume).GUID;
    Marshal.ThrowExceptionForHR(dev.Activate(ref epvid, /*CLSCTX_ALL*/ 23, 0, out epv));
    return epv;
  }
  public static float Volume {
    get {float v = -1; Marshal.ThrowExceptionForHR(Vol().GetMasterVolumeLevelScalar(out v)); return v;}
    set {Marshal.ThrowExceptionForHR(Vol().SetMasterVolumeLevelScalar(value, System.Guid.Empty));}
  }
  public static bool Mute {
    get { bool mute; Marshal.ThrowExceptionForHR(Vol().GetMute(out mute)); return mute; }
    set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); }
  }
}
'@

使用示例:

PS C:\> [Audio]::Volume         # Check current volume (now about 10%)
0,09999999
PS C:\> [Audio]::Mute           # See if speaker is muted
False
PS C:\> [Audio]::Mute = $true   # Mute speaker
PS C:\> [Audio]::Volume = 0.75  # Set volume to 75%
PS C:\> [Audio]::Volume         # Check that the changes are applied
0,75
PS C:\> [Audio]::Mute
True
PS C:\>

如果您需要的话,有更全面的 Core Audio API .NET 包装器,但我不知道有一组 PowerShell 友好的 cmdlet。

PS Diogo 答案 看起来很聪明,但对我来说不起作用。

Starting with Vista you have to use the Core Audio API to control the system volume. It's a COM API that doesn't support automation and thus requires a lot of boilerplate to use from .NET and PowerShell.

Anyways the code bellow let you access the [Audio]::Volume and [Audio]::Mute properties from PowerShell. This also work on a remote computer which could be useful. Just copy-paste the code in your PowerShell window.

Add-Type -TypeDefinition @'
using System.Runtime.InteropServices;

[Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IAudioEndpointVolume {
  // f(), g(), ... are unused COM method slots. Define these if you care
  int f(); int g(); int h(); int i();
  int SetMasterVolumeLevelScalar(float fLevel, System.Guid pguidEventContext);
  int j();
  int GetMasterVolumeLevelScalar(out float pfLevel);
  int k(); int l(); int m(); int n();
  int SetMute([MarshalAs(UnmanagedType.Bool)] bool bMute, System.Guid pguidEventContext);
  int GetMute(out bool pbMute);
}
[Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDevice {
  int Activate(ref System.Guid id, int clsCtx, int activationParams, out IAudioEndpointVolume aev);
}
[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDeviceEnumerator {
  int f(); // Unused
  int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice endpoint);
}
[ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] class MMDeviceEnumeratorComObject { }

public class Audio {
  static IAudioEndpointVolume Vol() {
    var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator;
    IMMDevice dev = null;
    Marshal.ThrowExceptionForHR(enumerator.GetDefaultAudioEndpoint(/*eRender*/ 0, /*eMultimedia*/ 1, out dev));
    IAudioEndpointVolume epv = null;
    var epvid = typeof(IAudioEndpointVolume).GUID;
    Marshal.ThrowExceptionForHR(dev.Activate(ref epvid, /*CLSCTX_ALL*/ 23, 0, out epv));
    return epv;
  }
  public static float Volume {
    get {float v = -1; Marshal.ThrowExceptionForHR(Vol().GetMasterVolumeLevelScalar(out v)); return v;}
    set {Marshal.ThrowExceptionForHR(Vol().SetMasterVolumeLevelScalar(value, System.Guid.Empty));}
  }
  public static bool Mute {
    get { bool mute; Marshal.ThrowExceptionForHR(Vol().GetMute(out mute)); return mute; }
    set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); }
  }
}
'@

Usage sample:

PS C:\> [Audio]::Volume         # Check current volume (now about 10%)
0,09999999
PS C:\> [Audio]::Mute           # See if speaker is muted
False
PS C:\> [Audio]::Mute = $true   # Mute speaker
PS C:\> [Audio]::Volume = 0.75  # Set volume to 75%
PS C:\> [Audio]::Volume         # Check that the changes are applied
0,75
PS C:\> [Audio]::Mute
True
PS C:\>

There are more comprehensive .NET wrappers out there for the Core Audio API if you need one but I'm not aware of a set of PowerShell friendly cmdlets.

P.S. Diogo answer seems clever but it doesn't work for me.

弄潮 2024-07-15 09:52:50

在 ps1 powershell 脚本上使用以下命令:

$obj = new-object -com wscript.shell 
$obj.SendKeys([char]173)

Use the following commands on a ps1 powershell script:

$obj = new-object -com wscript.shell 
$obj.SendKeys([char]173)
天气好吗我好吗 2024-07-15 09:52:50

亚历山大的答案适合我的情况,但由于有关“var”命名空间的编译错误,他的示例不起作用。 似乎较新/不同版本的 .net 可能会导致该示例无法运行。 如果您发现收到编译错误,这是针对这些情况尝试的替代版本:

Add-Type -Language CsharpVersion3 -TypeDefinition @'
using System.Runtime.InteropServices;

[Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IAudioEndpointVolume {
  // f(), g(), ... are unused COM method slots. Define these if you care
  int f(); int g(); int h(); int i();
  int SetMasterVolumeLevelScalar(float fLevel, System.Guid pguidEventContext);
  int j();
  int GetMasterVolumeLevelScalar(out float pfLevel);
  int k(); int l(); int m(); int n();
  int SetMute([MarshalAs(UnmanagedType.Bool)] bool bMute, System.Guid pguidEventContext);
  int GetMute(out bool pbMute);
}
[Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDevice {
  int Activate(ref System.Guid id, int clsCtx, int activationParams, out IAudioEndpointVolume aev);
}
[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDeviceEnumerator {
  int f(); // Unused
  int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice endpoint);
}
[ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] class MMDeviceEnumeratorComObject { }

public class Audio {
  static IAudioEndpointVolume Vol() {
    var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator;
    IMMDevice dev = null;
    Marshal.ThrowExceptionForHR(enumerator.GetDefaultAudioEndpoint(/*eRender*/ 0, /*eMultimedia*/ 1, out dev));
    IAudioEndpointVolume epv = null;
    var epvid = typeof(IAudioEndpointVolume).GUID;
    Marshal.ThrowExceptionForHR(dev.Activate(ref epvid, /*CLSCTX_ALL*/ 23, 0, out epv));
    return epv;
  }
  public static float Volume {
    get {float v = -1; Marshal.ThrowExceptionForHR(Vol().GetMasterVolumeLevelScalar(out v)); return v;}
    set {Marshal.ThrowExceptionForHR(Vol().SetMasterVolumeLevelScalar(value, System.Guid.Empty));}
  }
  public static bool Mute {
    get { bool mute; Marshal.ThrowExceptionForHR(Vol().GetMute(out mute)); return mute; }
    set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); }
  }
}
'@

用法相同:

PS C:\> [Audio]::Volume         # Check current volume (now about 10%)
0,09999999
PS C:\> [Audio]::Mute           # See if speaker is muted
False
PS C:\> [Audio]::Mute = $true   # Mute speaker
PS C:\> [Audio]::Volume = 0.75  # Set volume to 75%
PS C:\> [Audio]::Volume         # Check that the changes are applied
0,75
PS C:\> [Audio]::Mute
True
PS C:\>

Alexandre's answer fit my situation, but his example does not work due to compilation errors regarding the namespace of 'var'. It seems that newer/different versions of .net may cause the example not to work. If you found that you received compilation errors, this is an alternative version to try for those cases:

Add-Type -Language CsharpVersion3 -TypeDefinition @'
using System.Runtime.InteropServices;

[Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IAudioEndpointVolume {
  // f(), g(), ... are unused COM method slots. Define these if you care
  int f(); int g(); int h(); int i();
  int SetMasterVolumeLevelScalar(float fLevel, System.Guid pguidEventContext);
  int j();
  int GetMasterVolumeLevelScalar(out float pfLevel);
  int k(); int l(); int m(); int n();
  int SetMute([MarshalAs(UnmanagedType.Bool)] bool bMute, System.Guid pguidEventContext);
  int GetMute(out bool pbMute);
}
[Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDevice {
  int Activate(ref System.Guid id, int clsCtx, int activationParams, out IAudioEndpointVolume aev);
}
[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDeviceEnumerator {
  int f(); // Unused
  int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice endpoint);
}
[ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] class MMDeviceEnumeratorComObject { }

public class Audio {
  static IAudioEndpointVolume Vol() {
    var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator;
    IMMDevice dev = null;
    Marshal.ThrowExceptionForHR(enumerator.GetDefaultAudioEndpoint(/*eRender*/ 0, /*eMultimedia*/ 1, out dev));
    IAudioEndpointVolume epv = null;
    var epvid = typeof(IAudioEndpointVolume).GUID;
    Marshal.ThrowExceptionForHR(dev.Activate(ref epvid, /*CLSCTX_ALL*/ 23, 0, out epv));
    return epv;
  }
  public static float Volume {
    get {float v = -1; Marshal.ThrowExceptionForHR(Vol().GetMasterVolumeLevelScalar(out v)); return v;}
    set {Marshal.ThrowExceptionForHR(Vol().SetMasterVolumeLevelScalar(value, System.Guid.Empty));}
  }
  public static bool Mute {
    get { bool mute; Marshal.ThrowExceptionForHR(Vol().GetMute(out mute)); return mute; }
    set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); }
  }
}
'@

Usage is the same:

PS C:\> [Audio]::Volume         # Check current volume (now about 10%)
0,09999999
PS C:\> [Audio]::Mute           # See if speaker is muted
False
PS C:\> [Audio]::Mute = $true   # Mute speaker
PS C:\> [Audio]::Volume = 0.75  # Set volume to 75%
PS C:\> [Audio]::Volume         # Check that the changes are applied
0,75
PS C:\> [Audio]::Mute
True
PS C:\>
坏尐絯℡ 2024-07-15 09:52:50

似乎没有一种快速简便的方法来调整音量。如果您有 C++ 经验,您可以使用 此博文,其中 Larry Osterman 描述了如何从以下位置调用 IAudioEndpointVolume 接口平台API(根据我在一些搜索中发现的内容,对于Vista、XP来说可能更困难)。

V2 确实允许您编译内联代码(通过 Add-Type),因此这可能是一个选项。

There does not seem to be a quick and easy way to adjust the volume.. If you have c++ experience, you could do something with this blog post, where Larry Osterman describes how to call the IAudioEndpointVolume interface from the platform api(for Vista, XP might be more difficult from what I've found in a few searches).

V2 does allow you to compile inline code (via Add-Type), so that might be an option.

素染倾城色 2024-07-15 09:52:50

您可以通过简单地管理 Windows 音频服务来以另一种方式剥皮。 停止为静音,启动为取消静音。

You could skin the cat another way by simply managing the Windows Audio Service. Stop it to mute, start it to unmute.

梦巷 2024-07-15 09:52:50

我知道它不是 PowerShell,但结合 Michael 和 Diogo 的答案给出了一个单行 VBScript 解决方案:

CreateObject("WScript.Shell").SendKeys(chr(173))

将其放入 mute.vbs 中,您只需双击即可切换静音

  • 仍然有效在 Windows 10 (10586.104) 中,
  • 无需像使用 PowerShell 那样设置 Set-ExecutionPolicy

I know it isn't PowerShell, but combining the answers from Michael and Diogo gives a one-line VBScript solution:

CreateObject("WScript.Shell").SendKeys(chr(173))

Slap this in mute.vbs, and you can just double-click to toggle mute

  • still works in Windows 10 (10586.104)
  • no need to Set-ExecutionPolicy as you might with PowerShell
花开雨落又逢春i 2024-07-15 09:52:50

vbscript中的解决方案:

Set WshShell = CreateObject("WScript.Shell")
For i = 0 To 50
  WshShell.SendKeys(chr(174))
  WScript.Sleep 100
Next

按键每次将音量减小2。

Solution in vbscript:

Set WshShell = CreateObject("WScript.Shell")
For i = 0 To 50
  WshShell.SendKeys(chr(174))
  WScript.Sleep 100
Next

The keys reduce the volume by 2 each time.

小矜持 2024-07-15 09:52:50

我没有找到如何在 PowerShell 中执行此操作,但有一个名为 NirCmd 的命令行实用程序,可以通过运行以下命令来实现此目的:

C:\utils\nircmd.exe mutesysvolume 0  # 1 to to unmute, 2 to toggle

NirCmd 可以在此处免费获得:
http://www.nirsoft.net/utils/nircmd.html

I didn't find how to do this in PowerShell, but there is a command-line utility called NirCmd that will do the trick by running this command:

C:\utils\nircmd.exe mutesysvolume 0  # 1 to to unmute, 2 to toggle

NirCmd is available for free here:
http://www.nirsoft.net/utils/nircmd.html

始于初秋 2024-07-15 09:52:50

查看我对 从 powershell 更改音频级别? 的回答

Set-DefaultAudioDeviceMute

Check out my answer to Change audio level from powershell?

Set-DefaultAudioDeviceMute
儭儭莪哋寶赑 2024-07-15 09:52:50

在获得对我的答案的一些反馈后,请再试一次

这是基于@frgnca的AudioDeviceCmdlets,可以在此处找到:https://github.com/frgnca/AudioDeviceCmdlets

这是将每个录音设备静音的代码。

Import-Module .\AudioDeviceCmdlets
$audio_device_list = Get-AudioDevice -list
$recording_devices = $audio_device_list | ? {$_.Type -eq "Recording"}
$recording_devices 
$recording_device_index = $recording_devices.Index | Out-String -stream
foreach ($i in $recording_device_index) {
    $inti = [int]$i
    Set-AudioDevice $inti | out-null -erroraction SilentlyContinue
    Set-AudioDevice -RecordingMute 1 -erroraction SilentlyContinue
}

您导入 AudioDeviceCmdlets dll,然后保存所有音频设备的列表,并筛选到录音设备。 您获取所有录音设备的索引,然后迭代每个设备,首先将该设备设置为主要音频设备,然后将该设备设置为静音(这两个步骤的过程是 dll 施加的限制)。

要取消所有静音,请将 -RecordingMute 1 更改为 RecordingMute 0

同样,要将播放设备静音,您可以使用以下代码:

Import-Module .\AudioDeviceCmdlets
$audio_device_list = Get-AudioDevice -list
$playback_devices = $audio_device_list | ? {$_.Type -eq "Playback"}
$playback_devices 
$playback_device_index = $playback_devices.Index | Out-String -stream
foreach ($i in $playback_device_index) {
$inti = [int]$i
    Set-AudioDevice $inti | out-null -erroraction SilentlyContinue
    Set-AudioDevice -PlaybackMute 1 -erroraction SilentlyContinue
}

要取消所有静音,请更改 -PlaybackMute 1 PlaybackMute 0

此代码来自我的一个更大项目的一部分,该项目通过 Arduino 连接到物理按钮/LED 静音状态显示器,以启用单个按钮按下以静音/取消静音所有系统麦克风(帮助 Zoom、Meet、Teams、Discord 等)并帮助人们避免尴尬的热麦克风事件。

https://github.com/dakota-mewt/mewt

1

PS 我真的很喜欢一些单行解决方案,例如 从 powershell 更改音频级别?

但是,请注意,单线静音通常仅适用于当前设置为 Windows 默认值的单个设备。 因此,如果您有能够处理不同音频设备(例如 Zoom 和 Meet)的软件,并且它们恰好使用非默认设备,则它可能无法按预期工作。

lemme try again, after getting some feedback on my answer

This is based on @frgnca's AudioDeviceCmdlets, found here: https://github.com/frgnca/AudioDeviceCmdlets

Here is code that will mute every recording device.

Import-Module .\AudioDeviceCmdlets
$audio_device_list = Get-AudioDevice -list
$recording_devices = $audio_device_list | ? {$_.Type -eq "Recording"}
$recording_devices 
$recording_device_index = $recording_devices.Index | Out-String -stream
foreach ($i in $recording_device_index) {
    $inti = [int]$i
    Set-AudioDevice $inti | out-null -erroraction SilentlyContinue
    Set-AudioDevice -RecordingMute 1 -erroraction SilentlyContinue
}

You import the AudioDeviceCmdlets dll, then save a list of all audio devices, filtered down into recording devices. You grab the index of all the recording devices and then iterate through each one, first setting the device to be your primary audio device, then setting that device to mute (this 2 step process is a limitation imposed by the dll).

To unmute everything, you change -RecordingMute 1 to RecordingMute 0

Similarly, to mute playback devices you can use this code:

Import-Module .\AudioDeviceCmdlets
$audio_device_list = Get-AudioDevice -list
$playback_devices = $audio_device_list | ? {$_.Type -eq "Playback"}
$playback_devices 
$playback_device_index = $playback_devices.Index | Out-String -stream
foreach ($i in $playback_device_index) {
$inti = [int]$i
    Set-AudioDevice $inti | out-null -erroraction SilentlyContinue
    Set-AudioDevice -PlaybackMute 1 -erroraction SilentlyContinue
}

To unmute everything, you change -PlaybackMute 1 to PlaybackMute 0

This code comes from part of a bigger project I have which hooks up to a physical button/LED mute status display via Arduino to enable single button press to Mute/Unmute all system microphones (to help with Zoom, Meet, Teams, Discord, etc.) and to help people avoid embarrassing hot-mic incidents.

https://github.com/dakota-mewt/mewt

1

P.S. I really like some of the one-line solutions like Change audio level from powershell?

However, note that a single-line muting typically applies only to the single device that's currently set as the windows default. So if you have software that's capable of addressing different audio devices (like Zoom and Meet), and they happen to be using a non-default device, it may not work as desired.

花落人断肠 2024-07-15 09:52:50

在上面的第二个脚本中,要在 PowerShell 7 或 PowerShell Core 中工作,请将第一行更改

-Language CsharpVersion3

为:...

-Language Csharp

在 W10 上工作

In the second script above, to work in PowerShell 7 or PowerShell Core in the 1st line change:

-Language CsharpVersion3

to...

-Language Csharp

Working on W10

坠似风落 2024-07-15 09:52:50

这是一个使用 autohotkey 的简单定时静音脚本(来自 autohotkey dotcom)。

m按钮::; 单击鼠标滚轮触发此脚本

SoundSet, +1,, Mute ; 静音PC声音

睡眠,27000; 等待 27 秒,让恼人的广告运行

SoundSet, +1,, Mute ; 取消 PC 声音静音

Here's a simple timed mute script using autohotkey (from autohotkey dotcom).

mbutton:: ; Trigger this script with a click on the mouse wheel

SoundSet, +1,, Mute ; Mute the PC sound

sleep, 27000 ; Wait 27 seconds for the annoying advertisement to run

SoundSet, +1,, Mute ; Unmute the PC sound

淡笑忘祈一世凡恋 2024-07-15 09:52:50

静音

Stop-Service -Name Audiosrv

取消静音

Start-Service -Name Audiosrv

Mute

Stop-Service -Name Audiosrv

Unmute

Start-Service -Name Audiosrv
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文