0

您如何使用 libspotify api 中的 sp_audio_buffer_stats (我正在修改点唱机示例)?我不明白如何填写 stutter 和 samples 变量,或者在哪里声明它等等。它来自代码的缓冲区部分吗?如果是这样,那将是 music_delivery 方法(来自点唱机示例)吗?

4

1 回答 1

1

概述

要使用libspotify播放音频,您首先注册一个 music_delivery 回调和一个 get_audio_buffer_stats 回调。您建立一个登录会话,调用 sp_session_player_load 加载曲目,等待它准备好,然后调用 sp_session_player_play 开始播放。

此时,libspotify 将开始调用您的 music_delivery 以定期发送音频数据。通常,您会将这些数据写入本地缓冲区,并使用其他库来播放该缓冲区中的音频。最有可能的是,该库还会定期向您发出从缓冲区请求数据的回调。如果 libspotify 未能足够快地提供音频数据,最终您的库会要求您提供音频数据,而您将无法提供任何音频数据,此时声音会断断续续或丢失。

为了避免这种情况,libspotify 还调用 get_audio_buffer_stats 来确定您最近是否遭受了丢失以及缓冲区中剩余多少音频,并调整它从服务器拉取音频的速率以进行补偿。

您如何使用 sp_audio_buffer_stats?

您使用它来告诉 libspotify 您的音频缓冲区的当前状态以及自上次查询以来您的丢失次数。

如何填写口吃和样本变量?

口吃应该是您用完音频数据并且未能按时将其传送到正在播放音频的任何东西的次数,从而导致声音口吃或丢失。

我假设,但不是 100% 肯定,样本应该是您当前缓冲的样本数 - 即您从 libspotify 接收并存储但尚未播放的样本数。我猜这是以帧为单位测量的,即每个通道的样本,因为您无法有效地细分帧。

我在哪里申报?

我真的不明白这部分问题。你的意思是在哪里定义 get_audio_buffer_stats 回调函数?将它定义在与定义 music_delivery 回调相同的位置可能最有意义。你的意思是在哪里存储 sp_audio_buffer_stats 结构?你没有 - 你的回调收到一个指向已经存在的指针,然后你填写它。

它是否来自代码的缓冲区部分?

同样,我不确定我是否理解这里。您将数据放入缓冲区并再次取出的代码是具有报告口吃和缓冲区状态信息的部分。在自动点唱机示例中,音频数据包缓冲在名为 audio_fifo_t 的数据结构中。我不相信它有任何簿记来跟踪缓冲区中的样本数或口吃数,但您可以想象将它添加到 audio.c、audio.h 以及可能在特定于平台的音频代码中。

那会是 music_delivery 方法吗?

我不明白。music_delivery 方法确实将音频放入缓冲区,因此从这个意义上说,它直接或间接地增加了缓冲区中的样本数。它对口吃的数量没有影响——当试图从缓冲区中取出音频时会发生这种情况

我不隶属于 Spotify。我已经使用音乐播放 API 编写了实验代码以将音频发送到网络音乐播放器,因此虽然我有实现 music_delivery 和 get_audio_buffer_stats 的经验,但我没有太多将其传递给传统音频 API 的经验。

另请参阅:spotify 会话回调 get_audio_buffer_stats

于 2013-07-13T10:20:32.150 回答