如何使用libspotify获取当前播放位置?

如何使用libspotify获取当前播放位置?,spotify,libspotify,Spotify,Libspotify,我一直在使用libspotify为一个项目编写Spotify支持,当我想要实现seeking时,我注意到显然没有函数来获取当前播放位置。换句话说,sp_session_player_seek()的对应项,它返回当前偏移量 有些人似乎是保存上次seek()调用中使用的偏移量,然后在music_delivery中累积计数器中的帧数。与存储的偏移量一起,可以通过这种方式计算当前位置,是的-但这真的是唯一的方法吗 我知道Spotify Web API有一种获得当前位置的方法,所以奇怪的是,Libsoti

我一直在使用libspotify为一个项目编写Spotify支持,当我想要实现seeking时,我注意到显然没有函数来获取当前播放位置。换句话说,sp_session_player_seek()的对应项,它返回当前偏移量

有些人似乎是保存上次seek()调用中使用的偏移量,然后在music_delivery中累积计数器中的帧数。与存储的偏移量一起,可以通过这种方式计算当前位置,是的-但这真的是唯一的方法吗


我知道Spotify Web API有一种获得当前位置的方法,所以奇怪的是,Libsotify没有这种方法。

以自己的方式跟踪它

从这个角度来看:libspotify实际上并不播放音乐,所以它不可能知道当前的位置

所有libspotify都会向您传递PCM数据。应用程序的工作是将这些信息传递给扬声器,音频管道总是有各种各样的缓冲区和延迟等等。当你寻找时,你不是说“将播放移到这里”,而是说“从音轨的这一点开始给我PCM”


事实上,如果您只是计算帧数,然后将它们传递到音频管道,那么如果不考虑管道的缓冲区等,您的位置可能不正确。

您可以自己跟踪位置

例如:

 void SpSeek(int position)
 {
     sp_session_player_seek(mSession, position);
     mMsPosition = position;
 }


 int OnSessionMusicDelivery(sp_session *session, const sp_audioformat *format, const void *frames, int numFrames) 
 {
     return SendToAudioDriver(...)
 }
在我的例子中,我使用的是OpenSL(Android),每次缓冲区结束时,我都会像这样更新位置的值

 mMsPosition += (frameCount * 1000) / UtPlayerGetSampleRate();
其中numFrames是驱动程序使用的帧