gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:50:33 25 4
gpt4 key购买 nike

这是示例代码:

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 个月就开始编程了。

最佳答案

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

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

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

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

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

这会用右声道数据减去左声道数据,从而消除两个声道上相同的任何音频数据。这是消除歌曲中人声的基本技术。

您提议的编辑没有意义。您正在通过将其乘以 2 来更改指针 buffer 的值。这使得指针具有非常不同的内存地址,很可能是非法的,因此当在 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;
}

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

关于c - mpg123_read 之后的音频缓冲区,它是什么?我该如何操纵它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20929096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com