0

我正在尝试读取原始 .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);
4

1 回答 1

1

我设法找到了问题所在,对于其他所有通过的人。我提取的数据只是纯粹的声音数据,减去了标题。我的问题是它需要声音数据顶部的标题,这是另外 44 个字节。我所要做的就是将数组的大小增加 44 个字节,在开头拍打标头,然后更改这一行:

hdr.lpData=(LPSTR)&sound;

对此:

hdr.lpData=(LPSTR)sound;

现在,由于我解析了标题,我还可以正确地动态选择比特率,计算歌曲的长度,并用它做各种其他事情。

于 2015-05-24T14:28:47.970 回答