如何播放音频信号?
- wave的播放方法很多,可以用dsound,dshow,甚至是sndPlay,sendMciString等等方法都可以实现。但是这都是对于windows平台下的音频播放,如果换到windows mobile平台,就未必支持以上几种方式,这时就必须用到低级的wave系列的API了。
- 步骤1:
- 申请二个或二个以上的WAVEHDR结构,m_WaveHdr1,m_WaveHdr2
- 填充WAVEHDR结构, 如下:
- m_WaveHdr1.lpData = (LPTSTR)_pWaveData + 44;
- m_WaveHdr1.dwBufferLength = PLAY_BUFFE_SIZE;
- m_WaveHdr1.dwBytesRecorded = 0;
- m_WaveHdr1.dwUser = 0;
- m_WaveHdr1.dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP;
- m_WaveHdr1.dwLoops = 1;
- m_WaveHdr1.lpNext = NULL;
- m_WaveHdr1.reserved = 0;
- // 第二个的数据起止位置一定要大于第一个数据的播放缓冲大小,否则可能会声音不正常。
- m_WaveHdr2.lpData = (LPTSTR)_pWaveData + 44 + PLAY_BUFFE_SIZE;
- m_WaveHdr2.dwBufferLength = PLAY_BUFFE_SIZE;
- m_WaveHdr2.dwBytesRecorded = 0;
- m_WaveHdr2.dwUser = 0;
- m_WaveHdr2.dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP;
- m_WaveHdr2.dwLoops = 1;
- m_WaveHdr2.lpNext = NULL;
- m_WaveHdr2.reserved = 0;
- 步骤2:
- 在回调函数、回调线程或回调窗口的 WOM_DONE 响应里,作以下操作,
- LPWAVEHDR pWaveHeader = (LPWAVEHDR)dwParam1; // 系统自动识别是哪一个WAVEHDR播放完毕
- waveOutUnprepareHeader(hwo, pWaveHeader, sizeof(WAVEHDR)); // 清空设备缓存
- pWaveHeader->lpData += (5 * PLAY_BUFFE_SIZE);
- pWaveHeader->dwBufferLength = pThis->m_lLeaveSize < PLAY_BUFFE_SIZE ? pThis->m_lLeaveSize : PLAY_BUFFE_SIZE; // 得到正确的缓冲大小.
- waveOutPrepareHeader(hwo, pWaveHeader, sizeof(WAVEHDR));
- waveOutWrite(hwo, pWaveHeader, sizeof(WAVEHDR));
- 完成以上步骤,及可实现多段缓冲播放。
复制代码2.如何处理音频信号?
3.如何分析音频信号?
相关公式
窗函数类型矩型窗 RN(n)
汉明窗 0.54-0.46*cos[2*PI*n/(N-1)] 0≤n≤N-1
汉宁窗 0.5*[1-cos[2*PI*n/(N-1)]] 0≤n≤N-1
布莱克曼窗 0.42-0.5*cos[2*PI*n/(N-1)]+0.08cos[4*PI*n/(N-1))*RN(n)
计算功率 h(i)=sqrt(re(i)*re(i)+im(i)*im(i))
计算分贝 dBh(i)=20*log (h(i))
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你是搞数字信号处理的吗?
{:3_182:}{:3_182:}{:3_182:}