mpg123_read之后的音频缓冲区,它是什么?我该如何操纵它?

时间:2014-01-05 01:51:26

标签: c audio

这是示例代码:

while (mpg123_read(mh, buffer, buffer_size, &done) == MPG123_OK)
        {
                    //  -> I'm consider this line
            if((ao_play(dev, (char*)buffer, done)==0)){
            }
        }

在此代码中,我想在播放之前编辑音频。有人建议我用fft来做这件事,我个人试着这样做:

while (mpg123_read(mh, buffer, buffer_size, &done) == MPG123_OK)
        {
            buffer=((int)buffer)*2
            if((ao_play(dev, (char*)buffer, done)==0))
        }

进行实验,但这无能为力。那么,什么是缓冲区?我怎么能实时改变它?我可以阻止它并在恢复之后(在音乐播放器中也称为“暂停”)? 抱歉没有问题,但我开始计划的时间只有6个月。

2 个答案:

答案 0 :(得分:1)

缓冲区是一个内存块,用于包含任意的,有限数量的数据。在C中,它用作数组。如果缓冲区是动态分配的,则变量buffer是指向实际缓冲区(内存块)开始的地址的指针。您必须查看变​​量buffer的声明,以了解此类数组中元素的类型。

此外,您还必须查看mpg123文档,以了解如何解释mpg123_read()函数返回的数据。

根据您已解码的数据的性质进行有根据的猜测,我会说buffer可能是一个交错的短整数数组,包含未压缩16位立体声通道L和R的数据音频信号。通道L位于偶数索引元素处,通道R位于奇数索引元素处。

因此,可能的编辑方式如下:

for (int i=0;i<done;i+=2)
{
  buffer[i] = (buffer[i+1] - buffer[i]) / 2;
}

这将使用右声道数据减去左声道数据,取消两个声道上相同的任何音频数据。这是取消歌曲中人声的基本技巧。

您提议的编辑没有任何意义。您正在通过将指针buffer乘以2来更改其值。这使得指针具有非常不同的内存地址,很可能是非法的,所以当在ao_play()中使用该指针时,您将得到分段错误。

我想你想用你的例子做的是让你的音频数据更响亮两倍,不是吗?在这种情况下,您正在寻找:

for (int i=0;i<done;i+=2)
{
  if (buffer[i]>16383)
     buffer[i] = 32767;
  else if (buffer[i]<-16384)
     buffer[i] = -32768;
  else
     buffer[i] = 2*buffer[i];
}

要停止和恢复,你必须找到一种方法让你的程序检查你可以用输入设备改变的东西的价值(在窗口中按下按钮,按下按键等)。

例如,假设您有一个名为khbit()的函数,如果按下某个键,则返回非零值(此函数存在于DOS编译器中,有时可作为非标准库使用,以简化旧版本的可移植性DOS程序:如果有的话,请查看conio.h。然后你可以做这样的事情:

int paused = 0;  /* flip-flop variable to pause/resume playing */
while (mpg123_read(mh, buffer, buffer_size, &done) == MPG123_OK)
{
  if (!paused)
  {
    if((ao_play(dev, (char*)buffer, done)==0))
       break;
  }
  if (kbhit() && getchar()==' ')
     paused = !paused;
}

这将使用空格键播放/暂停您的音乐。

答案 1 :(得分:0)

它不会暂停音乐,只会将其静音。阅读(mpg123_read)继续,所以你只是跳过一个部分。