gpt4 book ai didi

C: 在 linux 中播放音频循环

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:04:33 26 4
gpt4 key购买 nike

我有一个 int16_t 缓冲区,里面有一些音频 PCM 数据。我需要从 a 点到 b 点重复播放缓冲区,以便您听到无限循环的音频。

我发现播放声音最简单的方法是使用 libao,但我同意任何其他方法。这是我的代码:

int play(int a, int b, char *buf);

int main()
{
int16_t *buf; /*my buffer*/
int a, b;
/* a and b are the indexes of the buffer;
* because libao wants a buffer of char,
* and buf points to of int16_t, I'll pass
* the value a and b multiplied with 2.
*/

[···]

play(2*a, 2*b, (char *) buf);
return 0;
}
int play(int a, int b, char *buf)
{
ao_device *device;
ao_sample_format format;
int default_driver;
/* -- Initialize -- */
fprintf(stderr, "libao example program\n");
ao_initialize();
/* -- Setup for default driver -- */
default_driver = ao_default_driver_id();
memset(&format, 0, sizeof(format));
format.bits = 16;
format.channels = 1;
format.rate = 44100;
format.byte_format = AO_FMT_LITTLE;
/* -- Open driver -- */
device = ao_open_live(default_driver, &format, NULL /* no options */);
if (device == NULL) {
fprintf(stderr, "Error opening device.\n");
exit(1);
}
/* -- Play the infinite loop -- */
for (;;){
ao_play(device, buf+a, b-a+1);
/*buf+a is the start of the loop, b-a+1 the number of byte to play--edited*/
}
/* -- Close and shutdown -- */
ao_close(device);
ao_shutdown();
return 0;
}

问题是我在循环结束和开始之间听到一段时间的静默。因为我正在使用这段代码来测试其他代码,所以我绝对需要知道这是否可能是由于不正确使用 libao 引起的。 .

最佳答案

是的,绝对有可能是libao使用不当造成的。请从 ao_play() 调用中删除 +1,如下所示:

ao_play(device, buf+a, b-a);

关于C: 在 linux 中播放音频循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15322856/

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