Be aware that inlen is an in/out parameter. It tells you how many samples the resampler read. That number can be smaller than what you passed -- in which case it means you need to buffer them and give them to the resampler again in the next call. Jean-Marc On 11/5/19 8:27 AM, zhouyuchen at iauto.com wrote:> Hello, > I have encountered some problems. I want to use speex to convert the > sampling rate (16000->48000). > When I read 640bytes each time, I found that the sound after the sound > conversion is very noisy, > but if I read 6400bytes each time. The conversion will be much better, > the line is my sample code, am I using it incorrectly? please help confirm? > > int main() > { > SpeexResamplerState *speex_resampler; > int err; > speex_resampler = speex_resampler_init(1, 16000, 48000, 10, &err); > FILE *fp = fopen("/data/zhou.wav", "rb+"); > FILE *fp2 = fopen("/data/zhou2.wav", "ab+"); > spx_int16_t inbuff[640] = {0}; > spx_int16_t outbuff[1920] = {0}; > spx_uint32_t inlen = 640; > spx_uint32_t outlen = 1920; > speex_resampler_skip_zeros(speex_resampler); > while (1) > { > int len = fread(inbuff, 2, 320, fp); > if (len <= 0) > { > break; > } > int ret = speex_resampler_process_int(speex_resampler, > 0, > inbuff, > &inlen, > outbuff, > &outlen); > printf("ret is %d\n", ret); > printf("outlen is %d\n",outlen); > fwrite(outbuff, 1, outlen, fp2); > } > > return 0; > } > > > > ------------------------------------------------------------------------ > 以上 > 如有问题,请联系我 > mail zhouyuchen at iauto.com <mailto:zhouyuchen at iauto.com> > tel 1905 >