@JEL Я обновил свой ответ. Пожалуйста, дайте мне знать, если это поможет вам. Если нет, мы можем поговорить, и я могу помочь вам пройти через это.
я есть видеоплеер, который можно воспроизводить из командного центра iOS и экрана блокировки. Когда я переключаю кнопку воспроизведения / паузы в моем приложении, она должна обновить кнопку воспроизведения / паузы в командном центре (MPRemoteCommandCenter
) путем обновленияnowPlayingInfo
(MPNowPlayingInfoCenter
). Я не уверен, почему он не обновляется.
Например, если я приостанавливаю видео с помощью пользовательской кнопки в моем приложении, в командном центре все еще отображается кнопка паузы (что означает, что видео все еще воспроизводится, что неправильно).
Вот так я обновляюnowPlayingInfo
:
func updateMPNowPlayingInforCenterMetadata() {
guard video != nil else {
nowPlayingInfoCenter.nowPlayingInfo = nil
return
}
var nowPlayingInfo = nowPlayingInfoCenter.nowPlayingInfo ?? [String: Any]()
let image: UIImage
if let placeholderLocalURL = video.placeholderLocalURL, let placeholderImage = UIImage(contentsOfFile: placeholderLocalURL.path) {
image = placeholderImage
} else {
image = UIImage()
}
let artwork = MPMediaItemArtwork(boundsSize: image.size, requestHandler: { _ -> UIImage in
return image
})
nowPlayingInfo[MPMediaItemPropertyTitle] = video.title
nowPlayingInfo[MPMediaItemPropertyAlbumTitle] = video.creator?.name ?? " "
nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork
nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = Float(video.duration)
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = Float(currentTime) // CMTimeGetSeconds(player.currentItem!.currentTime())
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate
nowPlayingInfo[MPNowPlayingInfoPropertyDefaultPlaybackRate] = player.rate
nowPlayingInfoCenter.nowPlayingInfo = nowPlayingInfo
if player.rate == 0.0 {
state = .paused
} else {
state = .playing
}
}
С КВО, когда игрокrate
изменения, я называю эту функцию:
// MARK: - Key-Value Observing Method
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
guard context == &assetPlaybackManagerKVOContext else {
super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
return
}
} else if keyPath == #keyPath(AVPlayer.rate) {
updateMPNowPlayingInforCenterMetadata()
}
}
Какие-нибудь мысли?
ОБНОВИТЬЯ нашел решение, но не идеально в моем случае. Так что в моем приложении у меня есть 2 вида контроллера. Давайте назовем ихFeedVC
а такжеPlayerVC
, ТакFeedVC
имеетAVPlayer
Это всегда играют, но приглушены. Если вы нажмете на одну из них, тоPlayerVC
создается и воспроизводит полное видео.Если я остановлюсьAVPlayer
вFeedVC
перед тем какPlayerVC
тогда кнопка «воспроизведение / пауза» в NowPlayingInfoCenter работает отлично!
Есть ли способ сделать эту работу, не останавливая видео вFeedVC
?
Другая проблема заключается в том, чтоelapsed time
продолжает считать, если я не остановлю игроков вFeedVC
, Кажется, что если несколько игроков играют, кнопка воспроизведения / паузы и истекшее время неверны.