马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
afx_msg LRESULT CcsyinDlg::OnMM_WIM_DATA(WPARAM wParam, LPARAM lParam) //当音频输入设备采集到一定量的音频数据时触发
{
/*
wParam = (WPARAM) hInputDev 接收数据的波形音频输入设备的句柄
lParam = (LONG) lpwvhdr 指向 WAVEHDR 结构的指针,该结构标识包含数据的缓冲区
*/
pNewBuffer = (PBYTE)realloc(pSaveBuffer, dwDataLength + ((PWAVEHDR)lParam)->dwBytesRecorded);
/*
((PWAVEHDR)lParam)->dwBytesRecorded 缓冲区中已有的音频数据
说明:通过将已录制的音频数据字节数与当前缓冲区大小相加,你确保新分配的内存能够容纳已录制的数据以及之前已经存在的数据。
这是因为在音频数据流中,每次处理完缓冲区中的数据后,你需要将新录制的数据追加到之前已经录制的数据之后,
以便完整地保存整个音频流。所以你需要确保重新分配的内存大小足够大,以容纳已有的数据和新录制的数据
*/
if (pNewBuffer == NULL)
{
waveInClose(hWaveIn); //关闭指定的波形输入设备
/*
参数:HWAVEIN hwi
返回值:MMRESULT 如果成功则返回MMSYSERR_NOERROR
MMSYSERR_INVALHANDLE 指定的设备句柄无效
MMSYSERR_NODRIVER 不存在设备驱动程序
MMSYSERR_NOMEM 无法分配或锁定内存
WAVERR_STILLPLAYING 队列中仍有缓冲区
*/
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox(_T("内存数据错误"));
return TRUE;
}
pSaveBuffer = pNewBuffer;
CopyMemory(pSaveBuffer + dwDataLength, ((PWAVEHDR)lParam)->lpData,((PWAVEHDR)lParam)->dwBytesRecorded); //复制音频数据
dwDataLength += ((PWAVEHDR)lParam)->dwBytesRecorded;
if (bEnding)
{
waveInClose(hWaveIn);
return TRUE;
}
waveInAddBuffer(hWaveIn, (PWAVEHDR)lParam, sizeof(WAVEHDR));
//重新指定缓冲区,使缓冲区能够重新接收音频数据
return 0;
}
我的问题:pSaveBuffer是在缓冲区保存 音频数据的
这要是短时间录音还可以
要是长时间,比如录音笔可能录制2小时,这时是不是会出问题,因为内存不够大,如何解决这个问题 ??
问题:pSaveBuffer是在缓冲区保存音频数据的。如果要录制长时间的音频,比如2小时,会遇到内存不够大的问题。如何解决这个问题?
在长时间录制音频时,确实有可能会遇到内存不够的问题。为了解决这个问题,可以考虑以下几种方法:
1. 使用循环写入文件:不将所有音频数据保存在内存中,而是将数据循环写入文件缓冲区。在每个缓冲区的写入完成后,将其写入硬盘并释放内存。这样可以避免内存占用过大的问题。
2. 使用多个缓冲区轮流录音:创建多个缓冲区,每个缓冲区大小适当(例如1秒或更小),然后依次循环使用这些缓冲区进行录音。当一个缓冲区录满后,立即将其写入文件,然后再继续录制下一个缓冲区。这样可以分散内存的使用,并保证数据的连续性。
3. 使用文件映射:使用文件映射技术将音频数据直接映射到硬盘上的文件。这样可以避免频繁的内存分配和复制操作,节省内存空间。同时,可以利用操作系统的虚拟内存管理机制,将文件的部分内容加载到内存中进行读写操作,实现高效的数据处理。
4. 使用流式数据处理:不需要将整个音频数据保存在内存中,而是在录音过程中实时对数据进行处理或传输。可以考虑实时压缩、加密或网络传输等方式,减少对内存的依赖。
需要根据具体应用场景和要求选择合适的解决方案。以上方法都可以有效地避免长时间录音导致内存不足的问题,并兼顾数据的完整性和连续性。
|