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

来源:互联网 发布:重大网络教育学院 编辑:程序博客网 时间:2024/06/04 23:22
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     1typedef 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 IDif (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} 
原创粉丝点击