mciPlayParms.dwCallback = (DWORD)(LPVOID)hWnd;
mciPlayParms.dwFrom = from;
mciPlayParms.dwTo = to;
mciSendCommand(mciDevice, MCI_PLAY, MCI_FROM | MCI_TO | MCI_NOTIFY,(DWORD)(LPVOID)&mciPlayParms);mciPlayParms的两个参数from和to,怎样确定的?
比方说,我从语音的2/5处放音,
语音时长 - a
我设定from = 2/5 * a * 1000
to = a * 1000
转成毫秒之后,放音
出现如下问题: 11k采样率,8bit的语音播放正常
换了16k采样率8bit的语音,就出问题了,播放位置很难确定.请教各位,这问题如何解决?
mciPlayParms.dwFrom = from;
mciPlayParms.dwTo = to;
mciSendCommand(mciDevice, MCI_PLAY, MCI_FROM | MCI_TO | MCI_NOTIFY,(DWORD)(LPVOID)&mciPlayParms);mciPlayParms的两个参数from和to,怎样确定的?
比方说,我从语音的2/5处放音,
语音时长 - a
我设定from = 2/5 * a * 1000
to = a * 1000
转成毫秒之后,放音
出现如下问题: 11k采样率,8bit的语音播放正常
换了16k采样率8bit的语音,就出问题了,播放位置很难确定.请教各位,这问题如何解决?
我计算了语音的播放时长,然后从指定的2/5播放
在计算语音时长的时候就已经考虑了采样率和位数
语音的时长是准确的
而且实际操作中显示的from to 也是对应的毫秒数,不过播放出来总是只有前面的一点点
你知道这是为什么吗?
WAVEHDR pWaveOutHdr; //声音数据块头信息结构体
HWAVEOUT hWaveOut; //输出音频的句柄WAVEHDR pWaveOutHdr2; //播放音频文件的头信息
WAVEOUTCAPS pwoc2; //播放音频文件的设备信息
HWAVEOUT hWaveOut2; //播放音频文件的输出音频句柄/*
函数:播放wave文件
*/
void CIPPhoneDlg::PlayRecord(CString m_path,/*wave文件路径*/
DWORD pos/*开始的位置*/)
{
waveOutUnprepareHeader(hWaveOut,&pWaveOutHdr, sizeof(WAVEHDR) );
waveOutReset(hWaveOut);
waveOutClose(hWaveOut);
waveOutUnprepareHeader(hWaveOut2,&pWaveOutHdr2, sizeof(WAVEHDR) );
waveOutReset(hWaveOut2);
waveOutClose(hWaveOut2);
HPSTR lpData;//音频数据
WAVEFORMATEX lpFormat;
CFile fpp;
fpp.Open(m_path,CFile::modeRead);
fpp.Seek(20,0);
fpp.Read(&lpFormat,20);
fpp.Close();
m_BytesPerSecond=lpFormat.nSamplesPerSec;
fpp.Open(m_path,CFile::modeRead);
m_WaveLong=fpp.GetLength();
fpp.Seek(pos,0);
lpData=new char[m_WaveLong*3/2];
fpp.Read(lpData,m_WaveLong-pos);
fpp.Close();
if(m_WaveLong<0)
{
MessageBox("Failed to read the data chunk");
return;
}
m_PlayPro.SetRangeMax(m_WaveLong,TRUE);
//检查音频设备,返回音频输出设备的性能
if(waveOutGetDevCaps(WAVE_MAPPER,&pwoc2,sizeof(WAVEOUTCAPS))!=0)
{
MessageBox("Unable to allocate or lock memory");
return;
}
//检查音频输出设备是否能播放指定的音频文件
if(waveOutOpen(&hWaveOut2,0,&lpFormat,NULL,NULL,CALLBACK_NULL)!=0)
{
MessageBox("Failed to OPEN the wave out devices");
return;
}
//准备待播放的数据
pWaveOutHdr2.lpData =(HPSTR)lpData;
pWaveOutHdr2.dwBufferLength =m_WaveLong;
pWaveOutHdr2.dwFlags =0;
if(waveOutPrepareHeader(hWaveOut2,&pWaveOutHdr2,sizeof(WAVEHDR))!=0)
{
MessageBox("Failed to prepare the wave data buffer");
return;
}
//播放音频数据文件
if(waveOutWrite(hWaveOut2,&pWaveOutHdr2,sizeof(WAVEHDR))!=0)
{
MessageBox("Failed to write the wave data buffer");
return;
}
}