【问题标题】:How to get the current playback position with libspotify?如何使用 libspotify 获取当前播放位置?
【发布时间】:2014-02-26 22:24:50
【问题描述】:

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

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

我知道 Spotify Web API 有办法获取当前位置,所以奇怪的是 libspotify 没有。

【问题讨论】:

    标签: spotify libspotify


    【解决方案1】:

    以自己的方式跟踪它。

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

    所有 libspotify 都会向您传递 PCM 数据。将其输出到扬声器是应用程序的工作,音频管道总是有各种缓冲区和延迟等等。当您搜索时,您不是在说“将播放移到此处”,而是在说“从曲目中的这一点开始给我 PCM”。

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

    【讨论】:

      【解决方案2】:

      您始终可以自己跟踪位置。

      例如:

       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 是驱动程序消耗的帧数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-14
        • 2021-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-14
        相关资源
        最近更新 更多