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的语音,就出问题了,播放位置很难确定.请教各位,这问题如何解决?

解决方案 »

  1.   

    from to 是毫秒为计算单位的
    我计算了语音的播放时长,然后从指定的2/5播放
    在计算语音时长的时候就已经考虑了采样率和位数
    语音的时长是准确的
    而且实际操作中显示的from to 也是对应的毫秒数,不过播放出来总是只有前面的一点点
    你知道这是为什么吗?
      

  2.   

    有没有试过22K和44K的采样率的wav文件?好像wave格式文件11k,22k,44k是推荐的采样率,其他的采样率好像就不保证正常播放了。
      

  3.   

    WAVEOUTCAPS opwoc;                  //音频输出设备信息
    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;
    }

    }