pcm 데이터 에 wav 헤드 추가

PCM 데이터 가 정확 한 지 테스트 하기 위해 프로그램 을 써 서 pcm 데이터 에 wav 헤드 를 추가 하고 코드 네트워크 에서 찾 은 것 을 스스로 정리 했다.
컴 파일 된 프로그램 다운로드: http://download.csdn.net/detail/gavinr/3779759
/**
 * pcm2wav.c 
 * add wav head for pcm data
 */

#include <stdio.h>
#include <string.h>

//wav        :  
typedef   struct   {  
    char         fccID[4];        
    unsigned   long       dwSize;            
    char         fccType[4];    
}HEADER;  

typedef   struct   {  
    char         fccID[4];        
    unsigned   long       dwSize;            
    unsigned   short     wFormatTag;    
    unsigned   short     wChannels;  
    unsigned   long       dwSamplesPerSec;  
    unsigned   long       dwAvgBytesPerSec;  
    unsigned   short     wBlockAlign;  
    unsigned   short     uiBitsPerSample;  
}FMT;  

typedef   struct   {  
    char         fccID[4];          
    unsigned   long       dwSize;              
}DATA;  

void show_usage()
{
    printf("PCM 2 WAV usage
eg:pcm2wav pcm_file wav_file channels sample_rate bits
"); } int main(int argc, char **argv) { char src_file[128] = {0}; char dst_file[128] = {0}; int channels = 1; int bits = 16; int sample_rate = 22050; // .wav HEADER pcmHEADER; FMT pcmFMT; DATA pcmDATA; unsigned short m_pcmData; FILE *fp,*fpCpy; if (argc < 5) { show_usage(); return -1; } sscanf(argv[1], "%s", src_file); sscanf(argv[2], "%s", dst_file); sscanf(argv[3], "%d", &channels); sscanf(argv[4], "%d", &sample_rate); if (argc>6) { sscanf(argv[5], "%d", &bits); } printf("parameter analyse succeess
"); if((fp=fopen(src_file, "rb")) == NULL) // { printf("open pcm file %s error
", argv[1]); return -1; } if((fpCpy=fopen(dst_file, "wb+")) == NULL) // { printf("create wav file error
"); return -1; } // wav HEADER; .dwsize , Data 。 strcpy(pcmHEADER.fccID,"RIFF"); strcpy(pcmHEADER.fccType,"WAVE"); fseek(fpCpy,sizeof(HEADER),1); // HEADER , wav ; // wav HEADER; if(ferror(fpCpy)) { printf("error
"); } // wav FMT; pcmFMT.dwSamplesPerSec=sample_rate; pcmFMT.dwAvgBytesPerSec=pcmFMT.dwSamplesPerSec*sizeof(m_pcmData); pcmFMT.uiBitsPerSample=bits; strcpy(pcmFMT.fccID,"fmt "); pcmFMT.dwSize=16; pcmFMT.wBlockAlign=2; pcmFMT.wChannels=channels; pcmFMT.wFormatTag=1; // wav FMT; fwrite(&pcmFMT,sizeof(FMT),1,fpCpy); // FMT .wav ; // wav DATA; DATA.dwsize .wav strcpy(pcmDATA.fccID,"data"); pcmDATA.dwSize=0; // pcmDATA.dwsize 0 fseek(fpCpy,sizeof(DATA),1); // DATA , wav DATA; fread(&m_pcmData,sizeof(unsigned short),1,fp); // .pcm while(!feof(fp)) // .pcm .wav; { pcmDATA.dwSize+=2; // ; , ; fwrite(&m_pcmData,sizeof(unsigned short),1,fpCpy); // .wav ; fread(&m_pcmData,sizeof(unsigned short),1,fp); // .pcm } fclose(fp); // pcmHEADER.dwSize=44+pcmDATA.dwSize; // pcmDATA.dwsize pcmHEADER.dwsize rewind(fpCpy); // fpCpy .wav , HEADER DATA; fwrite(&pcmHEADER,sizeof(HEADER),1,fpCpy); // HEADER fseek(fpCpy,sizeof(FMT),1); // FMT, FMT fwrite(&pcmDATA,sizeof(DATA),1,fpCpy); // DATA; fclose(fpCpy); // return 0; }

좋은 웹페이지 즐겨찾기