我正在使用 Windows API 获取音频输入。我已经按照 MSDN 上的所有步骤进行操作,并设法将音频录制到 WAV 文件中。没问题。我正在使用多个缓冲区等等。我想对缓冲区做更多的事情,而不是简单地写入文件,所以现在我已经设置了回调。它工作得很好,我正在获取数据,但我不确定在获得数据后如何处理它。
这是我的回调...这里一切正常:
// Media API callback
void CALLBACK AudioRecorder::waveInProc(HWAVEIN hWaveIn, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
{
// Data received
if (uMsg == WIM_DATA)
{
// Get wav header
LPWAVEHDR mBuffer = (WAVEHDR *)dwParam1;
// Now what?
for (unsigned i = 0; i != mBuffer->dwBytesRecorded; ++i)
{
// I can see the char, how do get them into my file and audio buffers?
cout << mBuffer->lpData[i] << "\n";
}
// Re-use buffer
mResultHnd = waveInAddBuffer(hWaveIn, mBuffer, sizeof(mInputBuffer[0])); // mInputBuffer is a const WAVEHDR *
}
}
// waveInOpen cannot use an instance method as its callback,
// so we create a static method which calls the instance version
void CALLBACK AudioRecorder::staticWaveInProc(HWAVEIN hWaveIn, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{
// Call instance version of method
reinterpret_cast<AudioRecorder *>(dwParam1)->waveInProc(hWaveIn, uMsg, dwInstance, dwParam1, dwParam2);
}
就像我说的,效果很好,但我正在尝试执行以下操作:
- 将数据转换为short并复制到数组中
- 将数据转为float并复制到数组中
- 将数据复制到一个更大的字符数组,我将其写入 WAV
- 将数据中继到任意输出设备
我经常使用 FMOD,并且熟悉交错等等。但是 FMOD 将所有内容都作为 float 进行处理。在这种情况下,我要走另一条路。我想我基本上只是在寻找有关如何从 LPSTR 转换为 short、float 和 unsigned char 的资源。
提前致谢!
最佳答案
typedef struct {
LPSTR lpData;
// etc..
} WAVEHDR;
Hmya,有点笨拙。这当然不是 STR,应该是 PVOID。只需将其转换为您需要的任何类型即可:
short* data = (short*)(mBuffer->lpData);
unsigned samples = mBuffer->dwBytesRecorded / sizeof(short);
// etc..
关于c++ - waveInProc/Windows 音频问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4632502/