2

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

4

1 回答 1

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);
}
于 2014-01-15T07:47:43.743 回答