音频捕获





5.00/5 (4投票s)
立体声混音音频捕获,
引言
这个64位Visual Studio 2017 Community项目旨在捕获PC上正在播放的任何实时音频。
虽然它可以用来录制麦克风的声音,但使用多路复用声卡并从“立体声混音”设备录制时,可以获得最佳音质。
如何使用AudioCap
- 启动
AudioCap
。 - 开始播放电影(带音轨)或本地或互联网音频文件(流媒体)。
- 按下[开始捕获]按钮,即可查看示波器PCM WIMDATA曲线。
- 如果想创建“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波前模型查看器。