管理MP3的播放速度和位置

时间:2014-08-27 17:55:27

标签: c++ c audio signal-processing alsa

我试了好几个月才弄清楚它是如何运作的。我有一个我正在开发的程序,我有一个mp3文件进出我有pcm进入" alsa"用于播放。使用mpg123库,主要代码是:

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

现在,我的尝试基于在缓冲区上使用库avutil / avcodec来减少/增加一秒钟内的样本数量。结果很糟糕,听起来不可思议。在之前的一个问题中,有人建议我提高我的PC性能但是如果有一个简单的程序,比如" 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:已更新

1 个答案:

答案 0 :(得分:1)

在对av_resample的调用中,永远不会读取samples_consumed,因此会跳过任何未使用的帧。 此外,nsamples是常量值44100而不是实际读取的帧数(done来自mpg123_read)。 sizeof(dataOut)错了;它是指针的大小。 输入结束时is_last错误。

在播放功能中,sizeof(buffer)可能会出错,具体取决于buffer的定义。