高分求教,c语言waveframe 录音保存问题!

朱韦刚
领域专家: C/C++技术领域
2012-04-23 09:32:40
#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>

#pragma comment(lib, "winmm.lib")

#define BUFFER_SIZE (44100*16*2/8) // 录制声音长度
#define FRAGMENT_SIZE 1024 // 缓存区大小
#define FRAGMENT_NUM 4 // 缓存区个数

static unsigned char buffer[BUFFER_SIZE] = {0};
static int buf_count = 0;

// 函数定义
void CALLBACK waveInProc(HWAVEIN hwi, UINT uMsg,DWORD_PTR dwInstance,DWORD_PTR dwParam1,DWORD_PTR dwParam2 );

int main()
{
/* 录音 */

HWAVEIN hWaveIn;
WAVEFORMATEX wavform;
int i = 0;
int nReturn = 0;
WAVEINCAPS wic;
static WAVEHDR wh[FRAGMENT_NUM];

// Device
nReturn = waveInGetNumDevs(); //获取系统现在的设备数目
printf("查询到设备数目:%d\n", nReturn);
for (i= 0; i<= nReturn; i++)
{
WAVEINCAPS wic_c;
waveInGetDevCaps(i, &wic_c, sizeof(WAVEINCAPS));
printf("查询 到 设备: %d\t设备名: %s\n", i, wic_c.szPname);
}

// open
wavform.wFormatTag = WAVE_FORMAT_PCM;
wavform.nChannels = 2; //声道 1: 单声道 2: 立体声
wavform.nSamplesPerSec = 44100; //采样率
wavform.nAvgBytesPerSec = 44100*16*2/8;
wavform.nBlockAlign = 4;
wavform.wBitsPerSample = 16;
wavform.cbSize = 0;

waveInOpen(&hWaveIn, WAVE_MAPPER, &wavform, (DWORD_PTR)waveInProc, 0, CALLBACK_FUNCTION);

waveInGetDevCaps((UINT_PTR)hWaveIn, &wic, sizeof(WAVEINCAPS));
printf("打开的音频设备:%s\n", wic.szPname);

// 准备 buffer
for (i=0; i<FRAGMENT_NUM; i++)
{
wh[i].lpData = (char *)malloc(sizeof(char)* FRAGMENT_SIZE);
wh[i].dwBufferLength = FRAGMENT_SIZE;
wh[i].dwBytesRecorded = 0;
wh[i].dwUser = 0;
wh[i].dwFlags = 0;
wh[i].dwLoops = 1;
wh[i].lpNext = NULL;
wh[i].reserved = 0;

waveInPrepareHeader(hWaveIn, &wh[i], sizeof(WAVEHDR));
waveInAddBuffer(hWaveIn, &wh[i], sizeof(WAVEHDR));
}

// record
printf("Start to Record...\n");

while(1)
{
waveInStart(hWaveIn);
printf("当前录音帧数:%d\n",++buf_count);
}

printf("Record Over!\n\n");

// clean
waveInStop(hWaveIn);
waveInReset(hWaveIn);
for (i =0; i<FRAGMENT_NUM; i++)
{
waveInUnprepareHeader(hWaveIn, &wh[i], sizeof(WAVEHDR));
free (wh[i].lpData);
}
waveInClose(hWaveIn);
return getchar();
}

// 录音回调函数
void CALLBACK waveInProc(HWAVEIN hwi,UINT uMsg,DWORD_PTR dwInstance, DWORD_PTR dwParam1,DWORD_PTR dwParam2)
{
WAVEHDR *wavehdr = (WAVEHDR * )dwParam1;
int buf_len = 0;
int result = 0;

if (WIM_DATA == uMsg)
{
//录音设备返回数据时,触发该事件
if(!waveInUnprepareHeader(hwi, wavehdr,sizeof(WAVEHDR)))
{ //可以释放内存。有的情况虽然返回数据,但不能释放内存,
//如使用同一个WAVEHDR增加多个内存块时,会出现上述情况
memcpy(buffer, wavehdr->lpData , FRAGMENT_SIZE);//复制返回数据
buf_len = wavehdr->dwBytesRecorded;//记录录音数据长度
wavehdr->dwUser=0;//恢复设置FRAGMENT_SIZE
wavehdr->dwBufferLength = FRAGMENT_SIZE;
wavehdr->dwFlags=0;
result = waveInPrepareHeader(hwi,wavehdr,sizeof(WAVEHDR));
result = waveInAddBuffer(hwi,wavehdr,sizeof(WAVEHDR));
}
}
}



高手指教 :
1: 怎样循环录音?
2:怎样保存到文件?pcm 或wav的都行!
...全文
330 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qy06521235 2013-12-05
  • 打赏
  • 举报
回复
谢谢楼主最后一贴的分享,帮了我大忙了,谢谢!
朱韦刚 2012-04-26
  • 打赏
  • 举报
回复
搞定了,http://download.csdn.net/detail/zhuweigangzwg/4258723
朱韦刚 2012-04-25
  • 打赏
  • 举报
回复
我在网上找的都是消息响应的,用回调函数的很少,存储那不是很懂,格式方面,头什么的,希望高手指教!
朱韦刚 2012-04-24
  • 打赏
  • 举报
回复
各位大哥帮帮忙吧,我弄了好几天了!
朱韦刚 2012-04-24
  • 打赏
  • 举报
回复
高手指教下!!
rightorwrong 2012-04-24
  • 打赏
  • 举报
回复
你这样就是循环录音啊,当采集到指定长度的数据,waveInProc就调用了,你就可以写文件了啊
把这里的数据直接写文件就是pcm的了memcpy(buffer, wavehdr->lpData , FRAGMENT_SIZE);//复制返回数据
wav的directshow sample里有个wave类吧,直接调用,然后把数据写入就能达到要求
内容概要:本文提出一种基于融合鱼鹰搜索行为与柯西变异策略的改进麻雀优化算法(OCSSA),用于优化变分模态分解(VMD)的关键参数(如模态分量数K和惩罚因子α),以实现对滚动轴承振动信号的高效自适应分解,有效抑制模态混叠问题。经过OCSSA优化的VMD对原始信号进行预处理后,将分解得到的本征模态函数(IMF)重构为时频特征矩阵,作为卷积神经网络(CNN)的输入,以自动提取深层次的空间特征;随后,双向长短期记忆网络(BiLSTM)进一步挖掘特征序列中的前后向时序依赖关系,最终实现高精度的故障分类识别。该OCSSA-VMD-CNN-BiLSTM模型在西储大学公开轴承数据集上进行了充分验证,结果表明其在复杂噪声环境下对轴承不同故障类型与程度的诊断准确率显著优于传统方法,充分体现了智能优化算法与深度学习相结合在故障诊断领域的优越性能。; 适合人群:具备信号处理、机器学习及智能优化算法基础知识,从事机械装备状态监测、故障诊断、工业大数据分析等相关领域的科研人员、工程技术人员及高校研究生。; 使用场景及目标:①解决传统VMD参数依赖经验设定导致信号分解效果不稳定的问题;②提升强背景噪声和工况变化下滚动轴承早期微弱故障的检测灵敏度与分类准确率;③为智能制造和工业互联网背景下的关键设备智能运维与预测性维护提供一套可复现、高性能的技术解决方案。; 阅读建议:此资源以Matlab代码实现为核心,建议读者深入研读算法代码,重点理解OCSSA的寻优机制、VMD参数自适应选择过程以及CNN-BiLSTM的网络构建细节,通过复现完整实验流程,掌握从信号预处理、特征提取到智能分类的全流程关键技术,并尝试在自有数据集上进行迁移应用与性能对比。
源码链接: https://pan.quark.cn/s/a4b39357ea24 接口测试框架(基于json格式、http请求,python3,不兼容python2.x版本) 注:现在基于Excel文件管理测试用例基本实现,) 备注:大家在运行的时候,如果参数不需要key,只需要字典,可以在ddt_case.py和case.py改造parame,注释掉现在的parem,启用新的即可 依赖用例支持用例执行,在testCase的ddt_case.py有实现,逻辑在代码中有写,参数的格式{"name":"$case1=data"}即代表name的值是case1的data字段,简单的实现。 依赖用例是简单的实现,具体在业务上面还有很多复杂的要处理,知识实现了,部分的思路。 (目前在部分window上会出现FileNotFoundError [Errno 2] No such file or directory,这个bug是路径过长,解决方案为吧log日志放在当前目录,或者修改动态生成的文件的名字,给了第一种方式,测试日志放在当前目录) qq交流群:194704520 Alt text 使用的库 requests,绝大部分是基于Python原有的库进行的,这样简单方便, 使用脚本参数分离等思想,尽可能降低代码的耦合度。 如果你不配置钉钉机器人,注释到机器人相关的代码 首先我们来看下我们的目录 Alt text ### 1.Case文件夹用来存放我们的测试用例相关的, test_case用来存储我们的测试数据,Excel管理测试用例,yaml文件管理测试用例,后续要把yaml管理测试用例的也封装出来。 Interface对测试接口相关的封装,包括requests库,发送...
内容概要:本文档围绕“配电网两阶段鲁棒故障恢复研究”展开,提供了完整的Matlab代码实现方案,属于高水平期刊论文的复现资料。研究针对配电网在发生故障后的恢复问题,提出了一种两阶段鲁棒优化方法,有效应对系统中诸如负荷波动、分布式电源出力不确定性等多重不确定因素。第一阶段进行预决策,包括网络重构、关键设备投切等操作;第二阶段则根据实际发生的故障场景进行动态调整与恢复控制,确保系统在故障后仍能安全、稳定、可靠运行。该资源不仅包含可运行的Matlab代码,还隶属于一个涵盖电力系统优化、智能算法、路径规划、机器学习等多个技术方向的综合性科研服务体系。; 适合人群:具备电力系统分析基础、优化理论知识及Matlab编程能力的研究生、科研人员和工程技术人员,特别适用于从事智能电网、配电自动化、故障恢复策略、鲁棒优化等领域研究的专业人士。; 使用场景及目标:① 学习并复现顶刊关于配电网故障恢复的先进优化模型;② 掌握两阶段鲁棒优化在电力系统中的建模思路、求解流程与技术细节;③ 利用所提供的Matlab代码进行算法验证、仿真测试,并在此基础上开展扩展性科研工作,如改进模型、引入新约束或应用于其他系统。; 阅读建议:建议结合经典电力系统优化与鲁棒调度相关文献,深入理解两阶段鲁棒优化的数学建模原理与物理背景,通过实际运行和调试代码,观察不同参数设置对优化结果的影响,进而掌握算法的核心机制。同时可参考文档中提及的其他相关研究主题,拓展研究视野,推动科研创新。

2,554

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧