我需要一个C ++ API来枚举输入设备并为Windows Vista,Windows 7和Windows 8捕获声音。如果没有通用API,我可以为不同版本的Windows使用特定于操作系统的API。
我在微软网站上找到了一些参考资料,但我不知道该选择什么。您有什么推荐的吗?
答案 0 :(得分:3)
对于waveIn API,请使用waveInGetNumDevs()和waveInGetDevCaps()。 对于Core Audio API,请使用IMMDeviceEnumerator。 对于DirectShow,请阅读:http://msdn.microsoft.com/en-us/library/windows/desktop/dd377566(v=vs.85).aspx
这完全取决于架构的其余部分。你必须对捕获的PCM做一些事情,你可能知道什么。这应该可以帮助您决定使用什么技术。
答案 1 :(得分:1)
查看BASS library。
是:
获取当前存在的录制设备总数:
int a, count=0;
BASS_DEVICEINFO info;
for (a=0; BASS_RecordGetDeviceInfo(a, &info); a++)
if (info.flags&BASS_DEVICE_ENABLED) // device is enabled
count++; // count it
以44100hz 16位立体声开始录制:
FILE *file;
...
// the recording callback
BOOL CALLBACK MyRecordingWriter(HRECORD handle, void *buf, DWORD len, void *user)
{
fwrite(buf, 1, len, file); // write the buffer to the file
return TRUE; // continue recording
}
...
HRECORD record=BASS_RecordStart(44100, 2, 0, MyRecordingWriter, 0); // start recording
答案 2 :(得分:0)
下面的代码使用winapi录制声音并保存为.wav文件
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <Mmsystem.h>
#define ALIAS "random_str"
int main(int argc,char *argv[])
{
printf("|-----------------------|\n" \
"|Simple Winapi Recorder |\n" \
"|By @systheron |\n" \
"|-----------------------|\n");
char mci_command[100];
char ReturnString[300];
int mci_error;
sprintf(mci_command, "open new type waveaudio alias %s", ALIAS);
mci_error = mciSendString(mci_command, ReturnString, sizeof(ReturnString), NULL);
// set the time format
sprintf(mci_command,"set %s time format ms", ALIAS); // just set time format
mci_error = mciSendString(mci_command, ReturnString, sizeof(ReturnString), NULL);
// start recording
sprintf(mci_command, "record %s notify", ALIAS);
mci_error = mciSendString(mci_command, ReturnString, sizeof(ReturnString), NULL);
printf("Now recording, get key input to stop...\n");
char c= getc(stdin);
//stop recording
sprintf(mci_command,"stop %s", ALIAS);
mci_error = mciSendString(mci_command, ReturnString, sizeof(ReturnString), NULL);
// save the file
sprintf(mci_command, "save %s %s", ALIAS, "random.wav");
mci_error = mciSendString(mci_command, ReturnString, sizeof(ReturnString), NULL);
// close the device
sprintf(mci_command,"close %s", ALIAS);
mci_error = mciSendString(mci_command, ReturnString, sizeof(ReturnString), NULL);
printf("Recording stopped. Congrat, your file is save as: random.wav. \n");
return 0;
}
使用 g++ :
g++ index.cpp -o index.exe -lWinmm
注意:使用 -lWinmm 手动链接 Mmsystem.h