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

时间:2014-02-26 22:24:51

标签: spotify libspotify

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

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

我知道Spotify Web API有一种获取当前位置的方法,所以libspotify没有一个很奇怪。

2 个答案:

答案 0 :(得分:1)

自己跟踪它的方式。

看待它的方法是:libspotify实际上不播放音乐,所以它不可能知道当前的位置。

所有libspotify都会通过PCM数据。应用程序的工作就是将它传递给扬声器,音频管道总是有各种缓冲和延迟以及诸如此类的地方。当你寻找时,你不是说“将播放移动到这里”,你说的是“从轨道的这一点开始给我PCM”。

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

答案 1 :(得分:0)

您可以随时自行跟踪位置。

例如:

 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是驱动程序使用的帧。