我一直在使用libspotify为一个项目编写Spotify支持,当我想实现搜索时,我注意到显然没有功能来获得当前的播放位置。换句话说,是sp_session_player_seek()的对应物,它返回当前的偏移量。
有些人似乎要做的是保存上次seek()调用中使用的偏移量,然后在music_delivery中累积计数器中的帧数。与存储的偏移量一起,当前位置可以这样计算,是的 - 但这真的是唯一的方法吗?
我知道Spotify Web API有一种获取当前位置的方法,所以libspotify没有一个很奇怪。
答案 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是驱动程序使用的帧。