Windows c++ waveInStart 如何访问记录的数据并对其进行管理?

Posted

技术标签:

【中文标题】Windows c++ waveInStart 如何访问记录的数据并对其进行管理?【英文标题】:Windows c++ waveInStart how to access to recorded data and managing it? 【发布时间】:2015-06-30 14:54:42 【问题描述】:

我想在 Windows 下从麦克风录制一些音频,所以我使用 wave API。

这就是我的工作

QByteArray tmp;
QByteArray data;
char dst[SAMPLES_TO_SEND];
qint64 tot=0;
const int NUMPTS = SAMPLES_TO_SEND*3;
int sampleRate = 48000;
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;
WAVEHDR      WaveInHdr;
MMRESULT result;

// Specify recording parameters
WAVEFORMATEX pFormat;
pFormat.wFormatTag=WAVE_FORMAT_PCM;     // simple, uncompressed format
pFormat.nChannels=1;                    //  1=mono, 2=stereo
pFormat.nSamplesPerSec=sampleRate;      // 48000
pFormat.nAvgBytesPerSec=sampleRate*2;   // = nSamplesPerSec * n.Channels * wBitsPerSample/8
pFormat.nBlockAlign=2;                  // = n.Channels * wBitsPerSample/8
pFormat.wBitsPerSample=16;              //  16 for high quality, 8 for telephone-grade
pFormat.cbSize=0;

result = waveInOpen(&hWaveIn, WAVE_MAPPER,&pFormat, 0L, 0L, WAVE_FORMAT_DIRECT);

if (result)

    WCHAR fault[256];
    waveInGetErrorText(result, fault, 256);
    return -1;


// Set up and prepare header for input
WaveInHdr.lpData = (LPSTR)waveIn;
WaveInHdr.dwBufferLength = NUMPTS*2;
WaveInHdr.dwBytesRecorded=0;
WaveInHdr.dwUser = 0L;
WaveInHdr.dwFlags = 0L;
WaveInHdr.dwLoops = 0L;
waveInPrepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));

// Insert a wave input buffer
result = waveInAddBuffer(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));
if (result)

    return -1;


// Commence sampling input
result = waveInStart(hWaveIn);
if (result)

 return -1;

此时,我必须做些什么来访问和管理记录的数据?我的最终目标是连续记录小数据(我每次都想要 512 个样本)对我记录的内容进行二次采样以得到 16 kHz 的样本(所以我会将数据除以 3)并应用 ulaw 算法并通过 udp 发送所有内容。这就是为什么我的缓冲区如此之小(NUMPTS = 1536 个短裤 -> 3072 字节)。 睡眠 100 毫秒后,我检查了 waveIn 中有什么,但都是 0... (当然,我的麦克风工作正常)

【问题讨论】:

文档中没有例子吗? 也许有,但我找不到任何东西 【参考方案1】:

waveInOpen 函数提供了四个回调选项,用于在缓冲区被填满时通知您。使用其中一种选择。

您还应该分配第二个缓冲区并在第一个缓冲区之后立即输出。当第一个缓冲区被填满时,它将在驱动程序中排队并无缝切换。

【讨论】:

以上是关于Windows c++ waveInStart 如何访问记录的数据并对其进行管理?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Windows 桌面 (C++) 打开 Visual Studio Express 2013? [关闭]

如何为这个 C++ Windows 项目制作“make.bat”?

如何为 Windows 编译 lsqlite3?

如何使用 C++ 在 Windows 中获取硬件信息?

Windows 驱动程序中的 C++ [关闭]

C++ 直接在屏幕上绘图(如覆盖)