如何在C#中静音麦克风

4
我想知道,如果我想切换麦克风的静音/取消静音,那么编码应该是什么样子的。我正在制作一个可以在后台运行并捕捉按键事件并切换麦克风静音/取消静音的程序。如果您能提供任何有关编码的帮助,那将非常有用。我对C#还比较陌生,这只是我想制作的一个非常简单的程序。它只会监听空格键的按下,即使程序在后台运行,当按下空格键时,它也会静音/取消静音麦克风。
非常感谢您的所有帮助!

它也可以静音单个设备,因为我正在“监听”麦克风或通过计算机扬声器播放它,所以Windows Vista和7将显示使用音量混合器的单个程序,因此,如果有一种编程方法可以静音/取消静音单个程序,那么该方法也将起作用。 - Sean
4个回答

5

对于Windows Vista及更高版本,您不能再使用媒体控制接口,Microsoft有一个新的Core Audio API,您必须访问它来与这些更新的操作系统中的音频硬件进行交互。

Ray Molenkamp编写了一个很好的托管包装器,用于与Core Audio API进行交互,网址在这里: Vista Core Audio API主音量控制

由于我需要能够从XP、Vista和Windows 7静音麦克风,所以我写了一个小Windows麦克风静音库,它在较新的操作系统上使用了Ray的库,而在Windows XP和更早版本中则使用了Gustavo Franco的MixerNative库的部分内容。


链接现在已经失效。 - ickydime
你可以使用 https://www.nuget.org/packages/AudioSwitcher.AudioApi.CoreAudio/4.0.0-alpha5。 - Konstantin Vdovkin

0

您可以使用MCI(媒体控制接口)来访问麦克风并在系统范围内更改它们的音量。请查看下面的代码,它应该将所有系统麦克风的音量设置为0。代码是用C编写的;请查看pinvoke以了解如何将此代码翻译成C#。

#include "mmsystem.h"
...
void MuteAllMics()
{
    HMIXER hmx; 
    mixerOpen(&hmx, 0, 0, 0, 0); 

    // Get the line info for the wave in destination line 
    MIXERLINE mxl; 
    mxl.cbStruct = sizeof(mxl); 
    mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN; 
    mixerGetLineInfo((HMIXEROBJ)hmx, &mxl, MIXER_GETLINEINFOF_COMPONENTTYPE); 

    // find the microphone source line connected to this wave in destination 
    DWORD cConnections = mxl.cConnections; 
    for (DWORD j=0; j<cConnections; j++)
    { 
        mxl.dwSource = j; 
        mixerGetLineInfo((HMIXEROBJ)hmx, &mxl, MIXER_GETLINEINFOF_SOURCE); 

        if (MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE == mxl.dwComponentType) 
        {
            // Find a volume control, if any, of the microphone line 
            LPMIXERCONTROL pmxctrl = (LPMIXERCONTROL)malloc(sizeof MIXERCONTROL); 
            MIXERLINECONTROLS mxlctrl = 
            {
                sizeof mxlctrl, 
                mxl.dwLineID, 
                MIXERCONTROL_CONTROLTYPE_VOLUME, 
                1, 
                sizeof MIXERCONTROL, 
                pmxctrl
            }; 
            if (!mixerGetLineControls((HMIXEROBJ) hmx, &mxlctrl, MIXER_GETLINECONTROLSF_ONEBYTYPE))
            { 
                DWORD cChannels = mxl.cChannels; 
                if (MIXERCONTROL_CONTROLF_UNIFORM & pmxctrl->fdwControl) 
                    cChannels = 1; 

                LPMIXERCONTROLDETAILS_UNSIGNED pUnsigned = (LPMIXERCONTROLDETAILS_UNSIGNED) 
                malloc(cChannels * sizeof MIXERCONTROLDETAILS_UNSIGNED); 
                MIXERCONTROLDETAILS mxcd = 
                {
                    sizeof(mxcd), 
                    pmxctrl->dwControlID, 
                    cChannels, 
                    (HWND)0, 
                    sizeof MIXERCONTROLDETAILS_UNSIGNED,
                    (LPVOID) pUnsigned
                }; 
                mixerGetControlDetails((HMIXEROBJ)hmx, &mxcd, MIXER_SETCONTROLDETAILSF_VALUE); 

                // Set the volume to the middle (for both channels as needed) 
                //pUnsigned[0].dwValue = pUnsigned[cChannels - 1].dwValue = (pmxctrl->Bounds.dwMinimum+pmxctrl->Bounds.dwMaximum)/2; 
                // Mute 
                pUnsigned[0].dwValue = pUnsigned[cChannels - 1].dwValue = 0;
                mixerSetControlDetails((HMIXEROBJ)hmx, &mxcd, MIXER_SETCONTROLDETAILSF_VALUE); 

                free(pmxctrl); 
                free(pUnsigned); 
            } 
            else 
            {
                free(pmxctrl); 
            }
        }
    } 
    mixerClose(hmx); 
}

在这里你可以找到更多关于此主题的代码

希望这有所帮助,致意


0

0

1
这怎么帮助静音麦克风? - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接