如何在Spotify播放器中快进或后退10秒钟。

10

我想在Spotify播放器中增加(向前)10秒的歌曲时长或减少(向后)10秒的歌曲时长,但我真的很困惑如何添加或减去。

当我尝试使用这段代码时,歌曲的持续时间没有改变。

// forward button action 
@IBAction func moveFrdBtnAction(_ sender: Any) {
  SpotifyManager.shared.audioStreaming(SpotifyManager.shared.player, didSeekToPosition: TimeInterval(10))
}

// spotify delegate method seekToPosition
func audioStreaming(_ audioStreaming: SPTAudioStreamingController!, didSeekToPosition position: TimeInterval) {
    player?.seek(to: position, callback: { (error) in
        let songDuration = audioStreaming.metadata.currentTrack?.duration as Any as! Double
        self.delegate?.getSongTime(timeCount: Int(songDuration)+1)
    })
}
我们正在使用相同的SDK在Android和iOS平台上制作一款音乐应用程序,Spotify SDK的seekToPosition方法在Android版本中可以正常工作,但是在iOS版本中却不能正常工作。代理方法会自己调用,但音乐会停止播放。
请问为什么会出现这种情况,我们该如何在iOS设备上运行它。
请问有人能够解释一下如何解决这个问题吗?我已经尝试过了,但是没有任何结果。
非常感谢任何帮助。
提前致谢。

你不应该自己调用由某个协议声明的对象的委托方法。相反,你可以在 moveFrdBtnAction(_:) 中调用 audioStreaming(_:didSeekToPosition:) 的代码。 - Robert Dresler
ya @RobertDresler,使用两个不同的类,一个是玩家类,另一个是 Spotify 类。在 Spotify 类中,使用了一个变量,并借助 shared 的委托来使用。 - user10984191
2个回答

1

我不使用这个API,所以我的答案将基于你的代码和Spotify的参考文档

我认为你的流程有几个问题:

  1. 正如Robert Dresler所评论的那样,你应该(大约)从不直接调用委托,而是委托调用你。
  2. 我很确定你的操作当前导致跳转10秒,而不是每次10秒。

(顺便说一句,我建议更改函数moveFrdBtnAction的名称,至少要添加更多的元音字母)

无论如何,这是我最好的猜测:

// forward button action 
@IBAction func moveForwardButtonAction(_ sender: Any) {
   skipAudio(by: 10)
}

@IBAction func moveBackButtonAction(_ sender: Any) {
   skipAudio(by: -10)
}

func skipAudio(by interval: TimeInterval) {
   if let player = player {
      let position = player.playbackState.position // The documentation alludes to milliseconds but examples don't.
         player.seek(to: position + interval, callback: { (error) in
         // Handle the error (if any)
      })
   }
}

// spotify delegate method seekToPosition
func audioStreaming(_ audioStreaming: SPTAudioStreamingController!, didSeekToPosition position: TimeInterval) {
   // Update your UI
}

请注意,我之前没有处理过跟踪开始之前或结束之后的搜索,这可能会发生在简单的position + interval中。API 可能会为您处理此问题,也可能不会。

谢谢您的回复,但是当我再次尝试运行这段代码时,播放器卡住了并且没有响应,音频停止了。 - user10984191

0
你可以在这里查看示例:spotify/ios-sdk。在NowPlayingView example中,他们使用了'seekForward15Seconds',也许你可以使用它?如果你仍然需要10秒,我已经添加了一个函数如下。位置是以毫秒为单位的。

"position: 以毫秒为单位的要搜索的位置" 文档

ViewController.swift

var appRemote: SPTAppRemote {
    get {
        return AppDelegate.sharedInstance.appRemote
    }
}

fileprivate func seekForward15Seconds() {
    appRemote.playerAPI?.seekForward15Seconds(defaultCallback)
}

fileprivate seekBackward15Seconds() {
    appRemote.playerAPI?.seekBackward15Seconds(defaultCallback)
}

// TODO: Or you could try this function
func seekForward(seconds: Int){
    appRemote.playerAPI?.getPlayerState({ (result, error) in
        // playback position in milliseconds
        let current_position = self.playerState?.playbackPosition
        let seconds_in_milliseconds = seconds * 1000

        self.appRemote.playerAPI?.seek(toPosition: current_position + seconds_in_milliseconds, callback: { (result, error) in
            guard error == nil else {
                print(error)
                return
            }
        })
    })
}

var defaultCallback: SPTAppRemoteCallback {
        get {
            return {[weak self] _, error in
                if let error = error {
                    self?.displayError(error as NSError)
                }
            }
        }
    }

AppDelegate.swift

lazy var appRemote: SPTAppRemote = {
        let configuration = SPTConfiguration(clientID: self.clientIdentifier, redirectURL: self.redirectUri)
        let appRemote = SPTAppRemote(configuration: configuration, logLevel: .debug)
        appRemote.connectionParameters.accessToken = self.accessToken
        appRemote.delegate = self
        return appRemote
    }()

    class var sharedInstance: AppDelegate {
        get {
            return UIApplication.shared.delegate as! AppDelegate
        }
    }

编辑1:

为了使其正常工作,您需要遵循准备您的环境

framwork

将SpotifyiOS.framework添加到您的Xcode项目中

希望能对您有所帮助!


谢谢您的回复,但是当我尝试运行这段代码时,出现了一些错误,例如:1.未声明类型'SPTAppRemoteCallback',2.未声明类型'SPTAppRemote'。 - user10984191
@ShamDass,请看我附上的链接,了解如何准备您的环境以运行演示:https://github.com/spotify/ios-sdk#prepare-your-environment - Anton Bärwald
好的,非常感谢。我会尝试的。 - user10984191
@ShamDass 如果你有时间的话,请分享进展情况。 - Anton Bärwald
@ShamDass 好的,你试过 seekForward15Seconds 函数了吗? - Anton Bärwald
是的,但是同样的问题。 - user10984191

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接