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

0

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

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

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

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

Edit я Добавить часть кода, чтобы попытаться объяснить.

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: Обновлено с изменениями

  • 1
    "если простая программа, такая как" VLC ", может сделать это на старых компьютерах, почему я не могу?" Вы смотрели на исходный код для VLC?
  • 0
    Если вы не объясните, как вы используете avutil/avcodec как вы ожидаете, что кто-нибудь поможет? Что касается изменения положения в аудиофайле, это будет зависеть от возможностей используемой вами библиотеки - если она не сможет этого сделать, вам придется прочитать весь файл в память.
Показать ещё 4 комментария
Теги:
audio
signal-processing
alsa

1 ответ

1
Лучший ответ

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню