求助,语音wav 采样频率8000,采样位数16,单声道,PCM 怎么转换成 wav 8000采样 8位 单声道 CCITT A-Law格式,谁有源码或之前做过的?
我是反方向转换,,同求,
#include
#include
#include
/* wav音频头部格式 */
typedef struct _wave_pcm_hdr
{
char riff[4]; // = "RIFF"
int size_8; // = FileSize - 8
char wave[4]; // = "WAVE"
char fmt[4]; // = "fmt "
int fmt_size; // = 下一个结构体的大小 : 16
short int format_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 int block_align; // = 每采样点字节数 : wBitsPerSample / 8
short int bits_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(int argc , char **argv)
{
wave_16bit_to_8bit("tts_sample.wav","tts_sample.wav");
return 0 ;
}