Я пытаюсь перепрограммировать захваченный 2channel/48khz/32bit audio в 1channel/8khz/32bit с использованием libsamplerate в проекте телефона Windows с использованием WASAPI.Resample audio с использованием libsamplerate в Windows Phone
мне нужно получить 160 кадров из 960 оригинальных кадров, повторно sampling.After захвата звука не используя 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 в реальном времени. Что может быть источником проблемы?
Вы сначала конвертировали из целых чисел в float? Значит, 'buf' содержит целые выборки или образцы с плавающей точкой? –
У вас есть утечка памяти здесь: 'float * res1 = new float [960];' потому что вы переназначаете 'res1' сразу после этого, теряя единственный указатель на выделенную память. – Nabla
@Nabla Спасибо за ваш намек. Я не очень хорошо C++. Но я не думаю, что это главная проблема. – harsini