【问题标题】:Get microphone sound level while recording in Windows 7在 Windows 7 中录制时获取麦克风音量
【发布时间】:2013-02-11 08:58:15
【问题描述】:

我正在实现一个简单的录制、播放应用程序,它可以播放和录制 WAV 文件。
要求如下:

1) Windows 7、Visual Studio 2010(或 2012)、C#
2) 使用规格信息录制、播放 Wav 文件:samplerate 22050、mono、bitspersample 16
3) 录音时可以显示微声级

使用 1) 和 2),我可以使用 lib (winmm.dll) 和 mciSendString(),如下所示

[DllImport("winmm.dll")]  
private static extern long mciSendString(string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback);

// Open file to play
public void open(string file)
{
    string command = "open \"" + file + "\" type waveaudio  alias MyWav";
    mciSendString(command, null, 0, 0);
}

// Start playing
public void play()
{
    string command = "play MyWav";
    mciSendString(command, null, 0, 0);
}

// Stop playing
public void stop()
{
    string command = "stop MyWav";
    mciSendString(command, null, 0, 0);

    command = "close MyWav";
    mciSendString(command, null, 0, 0);
}

// Start recording
public void record()
{
   string command = "open new Type waveaudio Alias MyRec";
    mciSendString(command, "", 0, 0);

    command = "set capture time format ms bitspersample 16 channels 1 samplespersec 22050 alignment 4";
    mciSendString(command, "", 0, 0);

    command = "record MyRec";
    mciSendString(command, "", 0, 0);
}

// Stop recording
public void stoprec()
{
    string fileName = @"""D:\Rec1.wav""";

    string command = "stop MyRec";
    mciSendString(command, "", 0, 0);

    command = @"save MyRec " + fileName;

    Debug.WriteLine(command);
    mciSendString(command, "", 0, 0);

    command = "close MyRec";
    mciSendString(command, "", 0, 0);
}

对于 3),我也想使用 mciSendString。我找到了以下命令(状态):

string command = "status MyRec level ";
long mci_ret = mciSendString(command, "", 0, 0);

但是我不知道从上面的命令中获取音量,谁能告诉我方法?

参考:来自 mciSendString() 的状态命令可在 Microsoft doc 中找到: http://msdn.microsoft.com/en-us/library/windows/desktop/dd798683%28v=vs.85%29.aspx
它说: level:返回当前 PCM 音频采样值。

【问题讨论】:

标签: c# windows-7 winmm mcisendstring


【解决方案1】:

我通过打开两个设备来监控级别,一个用于录制/播放(track1),另一个用于获取级别(waveLevel)。以下是foxpro中的。

* OPEN WAVE DEVICE FOR LEVEL READINGS 
= mciSendString("open new type waveaudio alias waveLevel", '0&', 0, 0) 

* START RECORDING
= mciSendString("open new type waveaudio alias track1", '0&', 0, 0)

然后为了获得 track1 的水平,我使用 waveLevel 设备

= mciSendString("status waveLevel level", @cBuff, LEN(cBuff) ,0)

【讨论】:

  • 感谢您的建议。我最终使用 NAudio 来完成我的任务。阅读所有代码并找出正确的方法。 Windows 7 和 8 都可以(在某些版本中检查,例如 Professional、Enterprise、Home Premium 等)
猜你喜欢
  • 2011-10-16
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多