Windows c++waveInStart如何访问记录的数据并对其进行管理
Windows c++ waveInStart how to access to recorded data and managing it?
我想在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个样本),对我记录的数据进行二次采样,以获得16kHz的样本(所以我会将数据除以3),并应用ulaw算法,并通过udp发送所有数据。这就是为什么我的缓冲区如此之小(NUMPTS=1536 shorts->3072字节)。睡了100毫秒后,我检查了waveIn中有什么,但都是0。。。(当然,我的麦克风工作正常)
waveInOpen函数提供四个回调选项,用于在缓冲区已填充时通知您。使用其中一个选项。
您还应该分配第二个缓冲区,并在第一个缓冲区之后立即输出。它将在驱动程序中排队,并在第一个缓冲区填满后无缝切换。
相关文章:
- 使用 std::vector<double> 访问由 std::unique_ptr<double[2] 管理的数据>
- 不可变数据模型的内存管理
- Lua 用户数据生命周期管理
- 有没有比具有多个维度的容器更好的解决方案来进行复杂的数据管理?
- 数据管理错误C++
- 可用于存储和管理整数集合的最佳C++数据结构是什么
- 如何在具有管理器类时封装数据
- 如何访问和管理块存储的数据
- 管理磁盘上的许多 GB 数据,直接访问
- 管理多维阵列的课程!我该如何管理单元格中的不同数据类型
- ENet 如何管理其到达的数据包
- 利用数据结构在C++上实现了一个图书馆管理系统
- 在 QSharedPointer 中管理 QAbstractItemModel 数据
- 用于管理容器的模板类,获取所包含数据类型
- 什么容器是管理XML数据的最佳容器
- 管理一组对象,以便被保存的对象可以访问保存它们的数据结构
- VAO/VBO管理-更改所有VBO数据
- 在c++中管理带有属性的大型空间数据集
- 数据结构向量的内存管理
- 如何初始化管理在实例化时传递数据类型的缓冲区的类