Resample аудио, используя libsamplerate в Windows Phone

Я пытаюсь повторно сэмплировать захваченное 2-канальное / 48 кГц / 32-битное аудио в 1-канальное / 8 кГц / 32-битное с использованием libsamplerate в проекте Windows Phone с использованием WASAPI.

Мне нужно получить 160 кадров из 960 оригинальных кадров путем повторной выборки. После захвата аудио с помощью GetBuffer метод я отправляю захваченный массив BYTE 7680 байт в метод ниже:

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 в реальном времени.
Что может быть источником проблемы?

2

Решение

Я нашел проблему. Я не должен делать новый 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);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]