鱼C论坛

 找回密码
 立即注册
查看: 727|回复: 4

[已解决]pSaveBuffer

[复制链接]
发表于 2023-8-4 06:16:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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小时,这时是不是会出问题,因为内存不够大,如何解决这个问题  ??



最佳答案
2023-8-4 06:17:08
问题:pSaveBuffer是在缓冲区保存音频数据的。如果要录制长时间的音频,比如2小时,会遇到内存不够大的问题。如何解决这个问题?

在长时间录制音频时,确实有可能会遇到内存不够的问题。为了解决这个问题,可以考虑以下几种方法:

1. 使用循环写入文件:不将所有音频数据保存在内存中,而是将数据循环写入文件缓冲区。在每个缓冲区的写入完成后,将其写入硬盘并释放内存。这样可以避免内存占用过大的问题。

2. 使用多个缓冲区轮流录音:创建多个缓冲区,每个缓冲区大小适当(例如1秒或更小),然后依次循环使用这些缓冲区进行录音。当一个缓冲区录满后,立即将其写入文件,然后再继续录制下一个缓冲区。这样可以分散内存的使用,并保证数据的连续性。

3. 使用文件映射:使用文件映射技术将音频数据直接映射到硬盘上的文件。这样可以避免频繁的内存分配和复制操作,节省内存空间。同时,可以利用操作系统的虚拟内存管理机制,将文件的部分内容加载到内存中进行读写操作,实现高效的数据处理。

4. 使用流式数据处理:不需要将整个音频数据保存在内存中,而是在录音过程中实时对数据进行处理或传输。可以考虑实时压缩、加密或网络传输等方式,减少对内存的依赖。

需要根据具体应用场景和要求选择合适的解决方案。以上方法都可以有效地避免长时间录音导致内存不足的问题,并兼顾数据的完整性和连续性。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-4 06:17:05 | 显示全部楼层
是的,如果录音时间过长,pSaveBuffer保存音频数据的缓冲区可能会不够大,导致内存不足的问题。为了解决这个问题,可以采用动态增长缓冲区的方式来保存音频数据。

一种常见的解决方案是使用动态数组或者链表来保存音频数据。当需要保存新的音频数据时,可以动态地分配更大的内存空间,并将之前的数据复制到新的内存空间中,然后再追加新的音频数据。这样就可以保证内存足够大来保存长时间的录音数据。

具体实现可以参考以下步骤:
1. 使用动态数组或者链表来保存音频数据。可以使用std::vector或者std::list等C++标准库提供的容器。
2. 当需要保存新的音频数据时,判断当前缓冲区的大小是否足够。如果不够大,就动态分配更大的内存空间。
3. 将之前的数据复制到新的内存空间中,并追加新的音频数据。
4. 更新缓冲区的大小和指针。
5. 当录音结束时,释放内存空间。

通过使用动态增长缓冲区的方式,可以解决长时间录音时内存不足的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-4 06:17:08 | 显示全部楼层    本楼为最佳答案   
问题:pSaveBuffer是在缓冲区保存音频数据的。如果要录制长时间的音频,比如2小时,会遇到内存不够大的问题。如何解决这个问题?

在长时间录制音频时,确实有可能会遇到内存不够的问题。为了解决这个问题,可以考虑以下几种方法:

1. 使用循环写入文件:不将所有音频数据保存在内存中,而是将数据循环写入文件缓冲区。在每个缓冲区的写入完成后,将其写入硬盘并释放内存。这样可以避免内存占用过大的问题。

2. 使用多个缓冲区轮流录音:创建多个缓冲区,每个缓冲区大小适当(例如1秒或更小),然后依次循环使用这些缓冲区进行录音。当一个缓冲区录满后,立即将其写入文件,然后再继续录制下一个缓冲区。这样可以分散内存的使用,并保证数据的连续性。

3. 使用文件映射:使用文件映射技术将音频数据直接映射到硬盘上的文件。这样可以避免频繁的内存分配和复制操作,节省内存空间。同时,可以利用操作系统的虚拟内存管理机制,将文件的部分内容加载到内存中进行读写操作,实现高效的数据处理。

4. 使用流式数据处理:不需要将整个音频数据保存在内存中,而是在录音过程中实时对数据进行处理或传输。可以考虑实时压缩、加密或网络传输等方式,减少对内存的依赖。

需要根据具体应用场景和要求选择合适的解决方案。以上方法都可以有效地避免长时间录音导致内存不足的问题,并兼顾数据的完整性和连续性。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-4 06:30:49 | 显示全部楼层
Mike_python小 发表于 2023-8-4 06:17
问题:pSaveBuffer是在缓冲区保存音频数据的。如果要录制长时间的音频,比如2小时,会遇到内存不够大的问题 ...

有文件映射的教程吗 ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-4 06:51:56 | 显示全部楼层
Mike_python小 发表于 2023-8-4 06:17
问题:pSaveBuffer是在缓冲区保存音频数据的。如果要录制长时间的音频,比如2小时,会遇到内存不够大的问题 ...

CFile  也是把文件数据全部读入缓冲区的

用什么类 不是全部读入  ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 18:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表