Управление скоростью воспроизведения и положением MP3

Я несколько месяцев пытаюсь понять, как это работает. У меня есть программа, которую я разрабатываю, у меня есть mp3-файл и у меня есть PCM, который идет к «alsa» для воспроизведения. Используя библиотеку mpg123, где основной код такой:

while (mpg123_read (mh, buffer, buffer_size, & done) == MPG123_OK)
sendoutput (dev, buffer, done);

Теперь мои попытки были основаны на использовании библиотеки avutil / avcodec в буфере для уменьшения / увеличения количества выборок за одну секунду. Результат ужасный и не слышно. В предыдущем вопросе кто-то посоветовал мне повысить производительность моего ПК, но если простая программа, такая как «VLC», может сделать это на старых компьютерах, почему я не могу?

А для проблемы положения в аудиофайле как этого добиться?

редактировать
Я добавляю часть кода, чтобы попытаться объяснить.

SampleConversion.c

#define LENGTH_MS 1000      // how many milliseconds of speech to store 0,5s:x=1:44100 x=22050 sample da memorizzare
#define RATE 44100      // the sampling rate (input)
struct AVResampleContext* audio_cntx = 0;
//(LENGTH_MS*RATE*16*CHANNELS)/8000
void inizializeResample(int inRate, int outRate)
{
audio_cntx = av_resample_init( outRate, //out rate
inRate, //in rate
16, //filter length
10, //phase count
0, //linear FIR filter
0.8 ); //cutoff frequency
assert( audio_cntx && "Failed to create resampling context!");
}
void resample(char dataIn[],char dataOut[],int nsamples)
{
int samples_consumed;
int samples_output = av_resample( audio_cntx, //resample context
(short*)dataOut,    //buffout
(short*)dataIn,     //buffin
&samples_consumed,  //&consumed
nsamples,       //nb_samples
sizeof(dataOut)/2,//lenout sizeof(out_buffer)/2 (Right?)
0);//is_last
assert( samples_output > 0 && "Error calling av_resample()!" );
}

void endResample()
{
av_resample_close( audio_cntx );
}

Моя отредактированная функция воспроизведения (Mpg123.c)

if (isPaused==0 && mpg123_read(mh, buffer, buffer_size, &done) == MPG123_OK)
{
int i=0; char * resBuffer=malloc(sizeof(buffer));
//resBuffer=&buffer[0];
resample(buffer,resBuffer,44100);
if((ao_play(dev, (char*)resBuffer, done)==0)){
return 1;
}
}

Оба кода сделаны мной, поэтому я не могу просить никого, кто когда-либо предлагал улучшения, как в предыдущем вопросе (хотя я не знаю, правы ли они, вздох)
Edit2: Обновлено с изменениями

0

Решение

В призыве к av_resample, samples_consumed никогда не читается, поэтому любые неиспользованные кадры пропускаются.
Более того, nsamples является постоянным значением 44100 вместо фактического количества прочитанных кадров (done от mpg123_read).
sizeof(dataOut) неправильно; это размер указателя.
is_last неправильно в конце ввода.

В функции воспроизведения sizeof(buffer) может быть ошибочным, в зависимости от определения buffer,

1

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


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector