使用windows phone中的libsamplerate重新采样音频

时间:2014-01-11 14:30:39

标签: c++ resampling wasapi audio-capture

我正在尝试使用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应用程序中使用该代码。 什么可能是问题的根源?

1 个答案:

答案 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);
}