在互联网的帮助下,我编写了一个程序,可以在麦克风运行时随时捕捉音频。一切都还可以,但我需要减少CPU的费用,因为现在大约是30-35%。
int SoundCapture()
{
const int NUMPTS = 8000 * 1; // Sample rate * seconds
int sampleRate = 8000;
short int waveIn[NUMPTS]; // 'short int' is a 16-bit type; I request 16-bit samples below
// for 8-bit capture, you'd use 'unsigned char' or 'BYTE' 8-bit types
HWAVEIN hWaveIn;
WAVEFORMATEX waveform;
WAVEHDR waveHeader;
waveform.wFormatTag = WAVE_FORMAT_PCM; // simple, uncompressed format
waveform.nChannels = 1; // 1=mono, 2=stereo
waveform.nSamplesPerSec = 8000;
waveform.nAvgBytesPerSec = 8000; // = nSamplesPerSec * n.Channels * wBitsPerSample/8
waveform.nBlockAlign = 1; // = n.Channels * wBitsPerSample/8
waveform.wBitsPerSample = 8; // 16 for high quality, 8 for telephone-grade
waveform.cbSize = 0;
MMRESULT result = waveInOpen(&hWaveIn, WAVE_MAPPER, &waveform, 0, 0, WAVE_FORMAT_DIRECT);
if (result)
{
std::cout << "Something wrong with WaveOpen";
std::cin.ignore(2);
return 0;
}
// Set up and prepare header for input
waveHeader.lpData = (LPSTR)waveIn; //pointer to waveform buffer
waveHeader.dwBufferLength = NUMPTS;
waveHeader.dwBytesRecorded = 0;
waveHeader.dwUser = 0L;
waveHeader.dwFlags = 0L;
waveHeader.dwLoops = 0L;
waveInPrepareHeader(hWaveIn, &waveHeader, sizeof(WAVEHDR));
// Insert a wave input buffer
result = waveInAddBuffer(hWaveIn, &waveHeader, sizeof(WAVEHDR));
if (result)
{
std::cout << "Something wrong with waveInAddBuffer";
std::cin.ignore(2);
return 0;
}
// Commence sampling input
time_t t = time(0); // get time now
result = waveInStart(hWaveIn);
if (result)
{
std::cout << "Something wrong with WaveStart";
std::cin.ignore(2);
return 0;
}
// Wait until finished recording
do {} while (waveInUnprepareHeader(hWaveIn, &waveHeader, sizeof(WAVEHDR)) == WAVERR_STILLPLAYING);
SaveWavFile(&waveHeader, t);
waveInClose(hWaveIn);
}
这是产生电荷的全部功能。我该如何减少?或者我不能?是否使用WindowsAPI以外的其他捕获方法?
我试着减少每秒的样本数,但没有多大帮助。我想这是关于缓冲的,但需要任何提示。
干杯
正如我们所评论的,cpu消耗是由于do-while循环中的活动等待造成的。我建议在窗口中使用Event对象。但作为立竿见影的解决方案,我建议睡几毫秒(做相关的计算,确切地知道什么是最佳时间,就像@MSchanges在评论中所说的那样(。
基于如何在Win 32上使用C++使程序休眠?一个可能的解决方案是:
#include <windows.h>
//....
do {
Sleep(X);
}
while (waveInUnprepareHeader(hWaveIn, &waveHeader, sizeof(WAVEHDR)) == WAVERR_STILLPLAYING);
//....