文档库 最新最全的文档下载
当前位置:文档库 › wav文件16bit量化比特转8bit量化比特

wav文件16bit量化比特转8bit量化比特

wav文件16bit量化比特转8bit量化比特
wav文件16bit量化比特转8bit量化比特

将WAV16bit量化比特转为8bit量化比特

#include

#include

/* wav音频头部格式*/

typedefstruct _wave_pcm_hdr

{

char riff[4]; // = "RIFF"

int size_8; // = FileSize - 8

char wave[4]; // = "WAVE"

charfmt[4]; // = "fmt "

int fmt_size; // = 下一个结构体的大小: 16

shortintformat_tag; // = PCM : 1

short int channels; // = 通道数: 1

int samples_per_sec; // = 采样率: 8000 | 6000 | 11025 | 16000 int avg_bytes_per_sec; // = 每秒字节数: samples_per_sec * bits_per_sample / 8

short intblock_align; // = 每采样点字节数: wBitsPerSample / 8

short intbits_per_sample; // = 量化比特数: 8 | 16

char data[4]; // = "data";

int data_size; // = 纯数据长度: FileSize - 44

} wave_pcm_hdr;

int wave_16bit_to_8bit(char *source_file,char *dest_file)

{

short *data_16 = NULL ;

char data_8 = 0 ;

unsigned char mdata_8 = 0 ;

unsigned char* dstemp = (unsigned char*)malloc(4);

FILE *pInput = NULL , * pOutput = NULL ;

wave_pcm_hdr wave_header_16 = {0};

wave_pcm_hdr wave_header_8 = {0};

if(strcmp(source_file,dest_file)==0)

{

printf("源文件名与目标文件名同名了;\n");

return -2 ;

}

pInput = fopen(source_file,"rb");

pOutput = fopen(dest_file,"wb");

if(pInput == NULL || pOutput == NULL)

{

printf("打开源文件或打开目标文件失败;\n");

return -1 ;

}

fread(&wave_header_16,1,44,pInput);

printf("bits_per_sample:%d;\n",wave_header_16.bits_per_sample);//16

memcpy(&wave_header_8,&wave_header_16,sizeof(wave_pcm_hdr));

wave_header_8.size_8 = (wave_header_16.size_8+8)/2 + 14;

wave_header_8.avg_bytes_per_sec = 8000;

wave_header_8.block_align = 1 ;

wave_header_8.bits_per_sample = 8 ;//改为8 ,上面的值也需要随之改变wave_header_8.data_size = wave_header_16.data_size/2 ;

fwrite(&wave_header_8,1,sizeof(wave_pcm_hdr),pOutput);

while(!feof(pInput))

{

fread(dstemp,1,4,pInput);

data_16 = (short*)dstemp;

data_8 = (*data_16) >> 8;

mdata_8 = data_8 + 128 ;

fwrite(&mdata_8,1,1,pOutput);

data_16 = (short*)(dstemp + 2);

data_8 = (*data_16) >> 8;

mdata_8 = data_8 + 128 ;

fwrite(&mdata_8,1,1,pOutput);

}

fclose(pOutput);

fclose(pInput);

return 0 ;

}

int main(intargc , char **argv)

{

wave_16bit_to_8bit("Sample.wav","dest.wav");

return 0 ;

}

相关文档