如何使用libspotify api中的sp_audio_buffer_stats(我正在修改自动存储塔示例)?我不明白如何填充结结巴巴和采样变量,或者在哪里声明它,等等。它来自代码的缓冲区部分吗?如果是这样的话,这会是music_dedelivery方法吗(以自动点唱机为例)?
概述
要使用libspotify播放音频,您首先注册一个music_dedelivery回调和一个get_audio_buffer_stats回调。建立登录会话,调用sp_session_player_load加载曲目,等待其就绪,然后调用sp_session_player_play开始播放。
此时,libspotify将开始调用您的music_dedelivery,以定期提供音频数据。通常,您会将这些数据写入本地缓冲区,并使用其他库来播放该缓冲区中的音频。最有可能的是,该库还会向您发出定期回调,从缓冲区请求数据。如果libspotify无法足够快地提供音频数据,最终你的库会向你索要音频数据,而你将无法提供,此时声音会断断续续或消失。
为了避免这种情况,libspotify还调用get_audio_buffer_stats来了解你最近是否出现过掉线的情况,以及缓冲区中还有多少音频,并调整从服务器上提取音频的速率以进行补偿。
如何使用sp_audio_buffer_stats
您可以使用它来告诉libspotify您的音频缓冲区的当前状态以及自上次查询以来的退出次数。
如何填写结结巴巴和样本变量
口吃应该是指你的音频数据用完,并且未能及时将其传递给正在播放音频的任何东西,导致声音断断续续或脱落的次数。
我假设,但不是100%确定,样本应该是你目前缓冲的样本数量,即你已经从libspotify收到并存储,但尚未播放的样本数量。我想这是以帧为单位测量的,即每个通道的样本,因为你不能有效地细分帧。
我在哪里申报
我真的不明白问题的这一部分。你的意思是在哪里定义get_audio_buffer_stats回调函数?在定义music_dedelivery回调的同一位置定义它可能是最有意义的。您的意思是sp_audio_buffer_stats结构存储在哪里吗?你没有-你的回调收到一个指向已经存在的指针,然后你填写它
它是否来自代码的缓冲区部分
再说一遍,我不确定我是否理解这里。将数据放入缓冲区并再次取出的代码是具有报告断断续续和缓冲区状态的信息的部分。在自动存储塔示例中,音频数据包被缓冲在一个名为audio_ifo_t的数据结构中。我不相信它有任何记账来跟踪缓冲区中的样本数量或断断续续的数量,但你可以想象将其添加到audio.c、audio.h中,也可能添加到特定平台的音频代码中。
这会是音乐传递的方法吗
我不明白。music_dedelivery方法确实将音频放入缓冲区,因此从这个意义上说,它直接或间接地增加了缓冲区中的采样数。它对口吃的数量没有影响——当试图将音频从缓冲区中取出时会发生口吃。
我不隶属于Spotify。我曾使用音乐播放API编写实验代码,将音频发送到网络音乐播放器,因此虽然我有实现music_dedelivery和get_audio_buffer_stats的经验,但我没有太多将其传递到传统音频API的经验。
另请参阅此处:spotify会话回调get_audio_buffer_stats