将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 ;
}