我正在尝试使用WASAPI在Windows Phone项目中使用libsamplerate将捕获的2channel / 48khz / 32bit音频重新采样为1channel / 8khz / 32bit。
我需要通过重新采样从960个原始帧中获取160帧。使用GetBuffer
方法捕获音频后,我将捕获的7680字节的BYTE数组发送到以下方法:
void BackEndAudio::ChangeSampleRate(BYTE* buf)
{
int er2;
st=src_new(2,1,&er2);
//SRC_DATA sd defined before
sd=new SRC_DATA;
BYTE *onechbuf = new BYTE[3840];
int outputIndex = 0;
//convert Stereo to Mono
for (int n = 0; n < 7680; n+=8)
{
onechbuf[outputIndex++] = buf[n];
onechbuf[outputIndex++] = buf[n+1];
onechbuf[outputIndex++] = buf[n+2];
onechbuf[outputIndex++] = buf[n+3];
}
float *res1=new float[960];
res1=(float *)onechbuf;
float *res2=new float[160];
//change samplerate
sd->data_in=res1;
sd->data_out=res2;
sd->input_frames=960;
sd->output_frames=160;
sd->src_ratio=(double)1/6;
sd->end_of_input=1;
int er=src_process(st,sd);
transportController->WriteAudio((BYTE *)res2,640);
delete[] onechbuf;
src_delete(st);
delete sd;
}
src_process方法不返回错误,sd->input_frames_used
设置为960,sd->output_frames_gen
设置为159但渲染输出仅为噪声。
我在实时VoIP应用程序中使用该代码。
什么可能是问题的根源?
答案 0 :(得分:1)
我发现了问题。我不应该创建一个新的SRC_STATE
对象并通过调用st=src_new(2,1,&er2);
和src_delete(st);
在我的函数的每次调用中删除它,但是调用它们一次就足够了整个音频重新采样。也不需要使用指针SRC_DATA
。我修改了我的代码如下,现在工作正常。
void BackEndAudio::ChangeSampleRate(BYTE* buf)
{
BYTE *onechbuf = new BYTE[3840];
int outputIndex = 0;
//convert Stereo to Mono
for (int n = 0; n < 7680; n+=8)
{
onechbuf[outputIndex++] = buf[n];
onechbuf[outputIndex++] = buf[n+1];
onechbuf[outputIndex++] = buf[n+2];
onechbuf[outputIndex++] = buf[n+3];
}
float *out=new float[160];
//change samplerate
sd.data_in=(float *)onechbuf;
sd.data_out=out;
sd.input_frames=960;
sd.output_frames=160;
sd.src_ratio=(double)1/6;
sd.end_of_input=0;
int er=src_process(st,&sd);
}