WAV中包含G711文件头问题
wav里面如果是pcm16的话文件会比较大,查阅文档说可以包含G711等格式,但是我实验了不行,小弟对这个了解仅限于度娘,不知道哪里出错,附上code,希望各位大侠指点
typedef struct waveformat_tag { WORD wFormatTag; /* format type */ WORD nChannels; /* number of channels (i.e. mono, stereo, etc.) */ DWORD nSamplesPerSec; /* sample rate */ DWORD nAvgBytesPerSec; /* for buffer estimation */ WORD nBlockAlign; /* block size of data */} WAVEFORMAT, *PWAVEFORMAT, NEAR *NPWAVEFORMAT, FAR *LPWAVEFORMAT;/* flags for wFormatTag field of WAVEFORMAT */#define WAVE_FORMAT_PCM 1/* specific waveform format structure for PCM data */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 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}