我在写程序时碰到一个问题:
如何创建一个空的WAV文件。
同时,如何把WAV文件读出,分成一段一段的在放音?

解决方案 »

  1.   

    创建一个WAV文件不难吧:)
    这样
    var
      F:TFileStream;
    begin
      F:=TFileStream.Create('D:\Empty.WAV',fmCreate);
      F.Free;
    end;//呵呵,我觉得这样就行。错别怪我哟,凭感觉。
      

  2.   

    如何把WAV文件读出,分成一段一段的在放音?
    先把文件头读出来,
    准备放一段语音时修改一下数据长度即可。比较简单
      

  3.   

    还不行就给我发mail 
    [email protected]
      

  4.   

    写入Wav文件头即可建立空文件Type 
      TPCMWaveHeader = record 
        rId : longint; 
        rLen : longint; 
        wId : longint; 
        fId : longint; 
        fLen : longint; 
        wFormatTag : word; 
        nChannels : word; 
        nSamplesPerSec : longint; 
        nAvgBytesPerSec : longint; 
        nBlockAlign : word; 
        wBitsPerSample : word; 
        dId : longint; 
        wSampleLength : longint; 
      end; 
      
    procedure WritePCMWaveFile(channels : word; resolution : word; rate : longint; filename : string); 
    { channels 1(单声)或者2(立体声) }
    { resolution 8或者16,代表8位或16位声音 }
    { rate  声音频率,如11025,22050, 44100 }
    var
    wf : file of TWavHeader;
    wh : TWavHeader;
    begin
    wh.rId := $46464952; 
    wh.rLen := 36; 
    wh.wId := $45564157; 
    wh.fId := $20746d66; 
    wh.fLen := 16; 
    wh.wFormatTag := 1; 
    wh.nChannels := channels;
    wh.nSamplesPerSec := rate; 
    wh.nAvgBytesPerSec := channels*rate*(resolution div 8);
    wh.nBlockAlign := channels*(resolution div 8);
    wh.wBitsPerSample := resolution;
    wh.dId := $61746164; 
    wh.wSampleLength := 0; 
    assignfile(wf,filename); {打开对应文件 } 
    rewrite(wf); {移动指针到文件头} 
    write(wf,wh); {写进文件头 } 
    closefile(wf); {关闭文件 } 
    end; 
    { 余下部分是音波(wave)数据。顺序是左声道低-高字节,右声道低-高字节,等等。}
      

  5.   


    m_hFile = ::mmioOpen(pWriteSoundFile->lpszFileName,NULL, MMIO_CREATE | MMIO_WRITE | MMIO_ALLOCBUF);
    if ( !m_hFile )
    return ERROR_SUCCESS; ZeroMemory(&m_MMCKInfoParent, sizeof(MMCKINFO)); m_MMCKInfoParent.fccType = mmioFOURCC('W','A','V','E');
    MMRESULT mmResult =  ::mmioCreateChunk( m_hFile,&m_MMCKInfoParent,
    MMIO_CREATERIFF);

    ZeroMemory(&m_MMCKInfoChild, sizeof(MMCKINFO));
    m_MMCKInfoChild.ckid = mmioFOURCC('f','m','t',' ');
    m_MMCKInfoChild.cksize = cbWaveFormatEx; mmResult = ::mmioCreateChunk(m_hFile, &m_MMCKInfoChild, 0); mmResult = ::mmioWrite(m_hFile, (char*)&pWriteSoundFile->waveFormatEx, cbWaveFormatEx);  mmResult = ::mmioAscend(m_hFile, &m_MMCKInfoChild, 0); m_MMCKInfoChild.ckid = mmioFOURCC('d', 'a', 't', 'a');
    mmResult = ::mmioCreateChunk(m_hFile, &m_MMCKInfoChild, 0 );