我正在努力阅读原始的.wav数据,并将数据输出给演讲者,主要是为了自我实验和教学。我自己想要数据的另一个原因是,我可以解析它,尝试分离音高,或者构建均衡器或某种可视化。到目前为止,我已经读取了文件中的数据,验证了头文件和诸如此类的内容,但是我去了WaveOut,它开始搞砸了。当然,我的代码目前是意大利面代码,但它更像是一个初步的测试,看我是否能做到这一点。据我目前所知,我的程序正在waveOutWrite()上崩溃,老实说,我不知道为什么,也找不到如何让WaveOut工作的好例子。以下是相关的部分:
BYTE *sound=(BYTE*)malloc(sizeof(BYTE)*data_size);
readByte(&in,data_size,sound);
cout<<"Loaded. Now playing...\n";
HWAVEOUT waveOut;
WAVEFORMATEX wF={format_tag,channels,sample_rate,byteRate,block_align,bits_per_sample,0};
MMRESULT result;
waveOutOpen(&waveOut,WAVE_MAPPER,&wF,0,0,CALLBACK_NULL);
WAVEHDR hdr;
ZeroMemory(&hdr,sizeof(WAVEHDR));
hdr.dwBufferLength=data_size;
hdr.lpData=(LPSTR)&sound;
waveOutPrepareHeader(waveOut,&hdr,sizeof(WAVEHDR));
waveOutWrite(waveOut,&hdr,sizeof(WAVEHDR));//Crashes here, no crash if commented out. No sound either way.
Sleep(500);
while(waveOutUnprepareHeader(waveOut,&hdr,sizeof(WAVEHDR))==WAVERR_STILLPLAYING)
Sleep(100);
waveOutClose(waveOut);发布于 2015-05-24 14:28:47
我设法找出了什么不对劲的地方,对其他通过的人来说。我所提取的数据只是纯粹的声音数据,减去标题。我的问题是,它需要在声音数据之上的标题,这是另外44个字节。我所要做的是将数组的大小增加44个字节,在开始时将标头放回原处,并更改这一行:
hdr.lpData=(LPSTR)&sound;对此:
hdr.lpData=(LPSTR)sound;现在,感谢我解析出标题,我也可以正确地选择一个比特率,计算歌曲的长度,并做各种其他事情,它,也。
https://stackoverflow.com/questions/30418907
复制相似问题