65.9K
CodeProject 正在变化。 阅读更多。
Home

音频捕获

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2017年4月13日

CPOL

1分钟阅读

viewsIcon

27271

downloadIcon

2247

立体声混音音频捕获, 带峰值电平显示

引言

这个64位Visual Studio 2017 Community项目旨在捕获PC上正在播放的任何实时音频。

虽然它可以用来录制麦克风的声音,但使用多路复用声卡并从“立体声混音”设备录制时,可以获得最佳音质。

如何使用AudioCap

  1. 启动AudioCap
  2. 开始播放电影(带音轨)或本地或互联网音频文件(流媒体)。
  3. 按下[开始捕获]按钮,即可查看示波器PCM WIMDATA曲线。
  4. 如果想创建“capture.wav”,请勾选“捕获到Wave”,或者如果只想查看峰值电平,请勾选“仅监控”。

背景

原始版本很久以前在XP时代用PowerBASIC编写的。

Using the Code

这是可以自定义以使用特定设备的OpenWaveIn函数。

搜索

if ((DeviceToUse == MICROPHONE) && (StrStrI(wic.szPname, L"micro"))) { break; } // Microphone
if ((DeviceToUse == STEREO_MIX) && (StrStrI(wic.szPname, L"stereo"))) { break; } // Stereo mix
DWORD OpenWaveIn(IN HWND hParent, IN long UseWaveFormat, IN long DeviceToUse) {
    WAVEINCAPS wic = { 0 };
    WORD zBitsPerSample = 0, zChannels = 0;
    LONG zSamplesPerSec = 0, I = 0;
    DWORD nRet = 0;

    switch (UseWaveFormat) {
    case WAVE_FORMAT_1M08: // Mono   11025 8-bit
         zChannels = 1; zSamplesPerSec = 11025; zBitsPerSample = 8;
         break;
    case WAVE_FORMAT_1S08: // Stereo 11025 8-bit
         zChannels = 2; zSamplesPerSec = 11025; zBitsPerSample = 8;
         break;
    case WAVE_FORMAT_1M16: // Mono   11025 16-bit
         zChannels = 1; zSamplesPerSec = 11025; zBitsPerSample = 16;
         break;
    case WAVE_FORMAT_1S16: // Stereo 11025 16-bit
         zChannels = 2; zSamplesPerSec = 11025; zBitsPerSample = 16;
         break;
    case WAVE_FORMAT_2M08: // Mono   22050 8-bit
         zChannels = 1; zSamplesPerSec = 22050; zBitsPerSample = 8;
         break;
    case WAVE_FORMAT_2S08: // Stereo 22050 8-bit
         zChannels = 2; zSamplesPerSec = 22050; zBitsPerSample = 8;
         break;
    case WAVE_FORMAT_2S16: // Stereo 22050 16-bit
         zChannels = 2; zSamplesPerSec = 22050; zBitsPerSample = 16;
         break;
    case WAVE_FORMAT_4M08: // Mono   44100 8-bit
         zChannels = 1; zSamplesPerSec = 44100; zBitsPerSample = 8;
         break;
    case WAVE_FORMAT_4S08: // Stereo 44100 8-bit
         zChannels = 2; zSamplesPerSec = 44100; zBitsPerSample = 8;
         break;
    case WAVE_FORMAT_4M16: // Mono   44100 16-bit
         zChannels = 1; zSamplesPerSec = 44100; zBitsPerSample = 16;
         break;
    case WAVE_FORMAT_4S16: // Stereo 44100 16-bit
         zChannels = 2; zSamplesPerSec = 44100; zBitsPerSample = 16;
         break;
    default:   //WAVE_FORMAT_2M16 Mono   22050 16-bit
         zChannels = 1; zSamplesPerSec = 22050; zBitsPerSample = 16;
    }
    LONG nDev = (LONG) waveInGetNumDevs();
    for (I = 0; I < nDev; I++) {
         nRet = waveInGetDevCaps(I, &wic, sizeof(wic));
         if (nRet == 0) {
             if (wic.dwFormats & UseWaveFormat) {
                 gCap.wfx.nChannels = zChannels;
                 gCap.wfx.nSamplesPerSec = zSamplesPerSec;
                 gCap.wfx.wFormatTag = WAVE_FORMAT_PCM;
                 gCap.wfx.wBitsPerSample = zBitsPerSample;
                 gCap.wfx.nBlockAlign = gCap.wfx.nChannels * gCap.wfx.wBitsPerSample / 8;
                 gCap.wfx.nAvgBytesPerSec = gCap.wfx.nSamplesPerSec * gCap.wfx.nBlockAlign;
                 gCap.wfx.cbSize = 0;
                 nRet = waveInOpen(&gCap.hWaveIn, I, &gCap.wfx, 
                 (DWORD_PTR) gCap.hAudioWnd, (DWORD_PTR)gCap.hAudioWnd, CALLBACK_WINDOW);
                 if (nRet == 0) {
                     if ((DeviceToUse == MICROPHONE) && 
                     (StrStrI(wic.szPname, L"micro"))) { break; } // Microphone
                     if ((DeviceToUse == STEREO_MIX) && 
                     (StrStrI(wic.szPname, L"stereo"))) { break; } // Stereo mix
                 }
            } else {
                 nRet = 22;   //"Le périphérique 
                 //ne reconnaît pas la commande." alias "No suitable device found"
            }
        }
    }
    return nRet;
}

还有这个链接向您展示如何设置Windows **以启用隐藏的“立体声混音”**模式。

关注点

代码完全以过程式模式编写,仅使用核心的扁平API SDK,以便易于从一种语言翻译成另一种语言。AudioCap.h部分也设计为易于转换为DLL。

您可以在我的私人论坛www.objreader.com上找到更多免费贡献,特别是如果您喜欢图形、多媒体、OpenGL和3D波前模型查看器。

© . All rights reserved.