gpt4 book ai didi

c++ - waveInProc/Windows 音频问题

转载 作者:可可西里 更新时间:2023-11-01 13:59:34 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com