天天看点

嵌入式 WAV中包含G711文件头有关问题

WAV中包含G711文件头问题

wav里面如果是pcm16的话文件会比较大,查阅文档说可以包含G711等格式,但是我实验了不行,小弟对这个了解仅限于度娘,不知道哪里出错,附上code,希望各位大侠指点

C/C++ code
typedef struct waveformat_tag {
    WORD    wFormatTag;        
    WORD    nChannels;         
    DWORD   nSamplesPerSec;    
    DWORD   nAvgBytesPerSec;   
    WORD    nBlockAlign;       
} WAVEFORMAT, *PWAVEFORMAT, NEAR *NPWAVEFORMAT, FAR *LPWAVEFORMAT;


#define WAVE_FORMAT_PCM     1



typedef struct pcmwaveformat_tag {
    WAVEFORMAT  wf;
    WORD        wBitsPerSample;
} PCMWAVEFORMAT, *PPCMWAVEFORMAT, NEAR *NPPCMWAVEFORMAT, FAR *LPPCMWAVEFORMAT;
typedef struct {
    CHAR    RIFF[4];                // 'R','I','F','F'
    DWORD   Size;                   // size of wave file from here on
    CHAR    WAVEfmt[8];             // 'W','A','V','E','f','m','t',' '
    DWORD   FormatSize;             // size of PCMWAVEFORMAT info (16 for PCM)
    PCMWAVEFORMAT pcm;              // PCM type data
    CHAR    FACT[4];                // FACT for 58bit  ulaw/alaw
    DWORD   FATSIZE;
    CHAR    temp[4];                // FACT for 58bit  ulaw/alaw
    CHAR    Data[4];                // 'd','a','t','a'
    DWORD   DataSize;               // size of the 'data' chunk
} REC_WAVE_FACT_HEADER, *PREC_WAVE_FACT_HEADER;
//Codec ID
if (nFmtFlg == 0X06 || nFmtFlg == 0x07)
    {
        REC_WAVE_FACT_HEADER pPPCM_WAVE_HEADER; 
        ZeroMemory(&pPPCM_WAVE_HEADER,sizeof(REC_WAVE_FACT_HEADER));
        DWORD pos = 0;
        try
        {
            pos = pcmFile.m_fFile.GetLength();
        }
        catch(...)
        {
            return;
        }//end of try
        pPPCM_WAVE_HEADER.RIFF[0]='R';
        pPPCM_WAVE_HEADER.RIFF[1]='I';
        pPPCM_WAVE_HEADER.RIFF[2]='F';
        pPPCM_WAVE_HEADER.RIFF[3]='F';
        
        //pPPCM_WAVE_HEADER.Size=nSize+40;
        pPPCM_WAVE_HEADER.Size=  pos + 50;
        pPPCM_WAVE_HEADER.WAVEfmt[0]='W';
        pPPCM_WAVE_HEADER.WAVEfmt[1]='A';
        pPPCM_WAVE_HEADER.WAVEfmt[2]='V';
        pPPCM_WAVE_HEADER.WAVEfmt[3]='E';
        pPPCM_WAVE_HEADER.WAVEfmt[4]='f';
        pPPCM_WAVE_HEADER.WAVEfmt[5]='m';
        pPPCM_WAVE_HEADER.WAVEfmt[6]='t';
        pPPCM_WAVE_HEADER.WAVEfmt[7]=' ';
        
        pPPCM_WAVE_HEADER.FormatSize=0x12;        
        
        //pPPCM_WAVE_HEADER.pcm.wf.wFormatTag=WAVE_FORMAT_PCM;
        pPPCM_WAVE_HEADER.pcm.wf.wFormatTag=nFmtFlg;
        pPPCM_WAVE_HEADER.pcm.wf.nChannels=1;
        pPPCM_WAVE_HEADER.pcm.wf.nSamplesPerSec=8000;
        pPPCM_WAVE_HEADER.pcm.wf.nAvgBytesPerSec=nBit*1000;
        pPPCM_WAVE_HEADER.pcm.wf.nBlockAlign=nBit/8;
        pPPCM_WAVE_HEADER.pcm.wBitsPerSample=nBit;

        pPPCM_WAVE_HEADER.FACT[0] = 'f';
        pPPCM_WAVE_HEADER.FACT[1] = 'a';
        pPPCM_WAVE_HEADER.FACT[2] = 'c';
        pPPCM_WAVE_HEADER.FACT[3] = 't';

        pPPCM_WAVE_HEADER.FATSIZE = 0x04000000;
        pPPCM_WAVE_HEADER.temp[0] = 0x00;
        pPPCM_WAVE_HEADER.temp[1] = 0x53;
        pPPCM_WAVE_HEADER.temp[2] = 0x07;
        pPPCM_WAVE_HEADER.temp[3] = 0x00;
        
        pPPCM_WAVE_HEADER.Data[0]='d';
        pPPCM_WAVE_HEADER.Data[1]='a';
        pPPCM_WAVE_HEADER.Data[2]='t';
        pPPCM_WAVE_HEADER.Data[3]='a';
//        pPPCM_WAVE_HEADER.DataSize=pos-sizeof(REC_WAVE_FACT_HEADER);
        pPPCM_WAVE_HEADER.DataSize=pos;
        
        try
        {
            pcmFile.m_fFile.SeekToBegin();
            pcmFile.m_fFile.Write(&pPPCM_WAVE_HEADER,sizeof(REC_WAVE_FACT_HEADER));
            //         fseek(pcmFile,0,SEEK_SET); 
            //         fwrite(&pPPCM_WAVE_HEADER,  sizeof(REC_WAVE_HEADER), 1, pcmFile );
        }
        catch (...)
        {
            return;
        }//end of try
}