使用MPRemoteCommandCenter为AVPlayer和AVAudioPlayer添加当前时间和持续时间的位置

Where to Add Current Time and Duration Time For AVPlayer and AVAudioPlayer using MPRemoteCommandCenter(使用MPRemoteCommandCenter为AVPlayer和AVAudioPlayer添加当前时间和持续时间的位置)
本文介绍了使用MPRemoteCommandCenter为AVPlayer和AVAudioPlayer添加当前时间和持续时间的位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的应用程序内的一个屏幕上,我既有一个用于音乐的AVAudioPlayer,也有一个用于视频的AVPlayer。用户可以交换不同的歌曲和不同的视频,但一次只能播放一个。他们既可以播放音频播放器,也可以在avPlayer上观看视频。

我有一个MPRemoteCommandCenter,在使用暂停/播放/ff/倒带时,它对两者都很好地工作。问题是我不能在锁定屏幕上显示任何一个的CurrentTime或持续时间。我尝试了this,但它没有说明将代码放在哪里。

这就是我尝试的方法,以便每次用户切换歌曲或视频时,我都拥有新项目的所有可用数据:

音频-

do {        
    audioPlayer = try AVAudioPlayer(contentsOf: audioTrack)
    audioPlayer?.delegate = self
    audioPlayer?.prepareToPlay()
    audioPlayer?.play()
        
    setupNowPlayingForAudio()
        
} catch { 
}

func setupNowPlayingForAudio() {
    guard let audioPlayer = audioplayer else { return }
    
    var nowPlayingInfo = [String : Any]()
    nowPlayingInfo[MPMediaItemPropertyTitle] = "My App Name"
    
    nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = Float(audioPlayer.currentTime)
    nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = Float(audioPlayer.duration)
    nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = audioPlayer.rate

    MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
}

视频-

playerStatusObserver = player?.observe(.currentItem?.status, options: [.new, .old]) {

    switch (player.status) {
     case .readyToPlay:

         player?.play() 
         setupNowPlayingForVideo()
    }
}

func setupNowPlayingForVideo() {
    guard let player = player, let playerItem = player.currentItem else { return }
    
    var nowPlayingInfo = [String : Any]()
    nowPlayingInfo[MPMediaItemPropertyTitle] = "My App Name"
    
    nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = playerItem.currentTime().seconds
    nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = playerItem.asset.duration.seconds
    nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate

    MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
}

MPRemoteCommandCenter与AVAudioSession一起在viewDidLoad中设置

推荐答案

我遵循了answer,这说明您必须将其添加到任何暂停/播放/ff/倒带按钮、滑块和任何收听玩家播放/停止的观察器中。以下是我做这件事的方式。这对我来说在锁屏上很好用。

这里是我对AudioPlayer-

使用以下函数的地方
do {        
    audioPlayer = try AVAudioPlayer(contentsOf: audioTrack)
    // ... 
    audioPlayer?.play()

    setupNowPlaying(musicPlayer: audioPlayer)
        
} catch { }

func audioPlayerPausePlayButton() {
     // ...
     setupNowPlaying(musicPlayer: audioPlayer)
}

func audioPlayerFastFowardAndRewindButton() {
    // ... ff or rewind functions
    setupNowPlaying(musicPlayer: audioPlayer)
}

这里是我对AVPlayer-

使用以下函数的地方
playerStatusObserver = player?.observe(.currentItem?.status, options: [.new, .old]) { // ...

    switch (player.status) {
     case .readyToPlay:

         // ... this should occur on the MainQueue
         self?.player?.play()
         self?.setupNowPlaying(videoPlayer: self?.player)
    }
}
// .. I also added it to any other observers that listen to the player stopping

func videoPlayerPausePlayButton() {
     // ...
     setupNowPlaying(videoPlayer: player)         
}

func videoPlayerFastFowardAndRewindButton() {
    // ...
    player?.seek(to: whateverSeekTime) { [weak self](_) in
        self?.setupNowPlaying(videoPlayer: self?.player)
    }
}

要在锁定屏幕上显示的CommandCenter的字典值

func setupNowPlaying(musicPlayer: AVAudioPlayer? = nil, videoPlayer: AVPlayer? = nil) {
    
    var nowPlayingInfo = [String : Any]()
    
    // audio
    if let musicPlayer = musicPlayer, let musicUrl = musicPlayer.url {
        
        nowPlayingInfo[MPNowPlayingInfoPropertyAssetURL] = musicUrl
        nowPlayingInfo[MPMediaItemPropertyTitle] = musicUrl.lastPathComponent
        nowPlayingInfo[MPNowPlayingInfoPropertyMediaType] = MPNowPlayingInfoMediaType.audio.rawValue
        
        let currentTime: TimeInterval = musicPlayer.currentTime
        let musicCurrentTimeCMTime = CMTime(seconds: currentTime, preferredTimescale: 1000)
        nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = CMTimeGetSeconds(musicCurrentTimeCMTime)
        
        let musicDuration: TimeInterval = musicPlayer.duration
        let musicDurationCMTime = CMTime(seconds: musicDuration, preferredTimescale: 1000)
        nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = CMTimeGetSeconds(musicDurationCMTime)
        
        if musicPlayer.isPlaying {
            nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = 1
        } else {
            nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = 0
        }
    }
    
    // video
    if let videoPlayer = videoPlayer, let currentItem = videoPlayer.currentItem {
        
        if let videoAsset = currentItem.asset as? AVURLAsset {
            let videoUrl = videoAsset.url
            nowPlayingInfo[MPNowPlayingInfoPropertyAssetURL] = videoUrl
            nowPlayingInfo[MPMediaItemPropertyTitle] = videoUrl.lastPathComponent
            nowPlayingInfo[MPNowPlayingInfoPropertyMediaType] = MPNowPlayingInfoMediaType.video.rawValue
        }
        
        if let videoDuration: CMTime = videoPlayer.currentItem?.duration {
            nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = CMTimeGetSeconds(videoDuration)
        }
        
        let videoCurrentTime: CMTime = videoPlayer.currentTime()
        let videoCurrentTimeAsSecs = CMTimeGetSeconds(videoCurrentTime)
        nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = videoCurrentTimeAsSecs
        
        print("videoCurrentTimeAsSecs: ", videoCurrentTimeAsSecs)
        
        if videoPlayer.isPlaying {
            nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = 1
        } else {
            nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = 0
        }
    }
    
    nowPlayingInfo[MPMediaItemPropertyTitle] = "Your App Name"
    nowPlayingInfo[MPNowPlayingInfoPropertyIsLiveStream] = false
    
    MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
}

这篇关于使用MPRemoteCommandCenter为AVPlayer和AVAudioPlayer添加当前时间和持续时间的位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Why local notification is not firing for UNCalendarNotificationTrigger(为什么没有为UNCalendarNotificationTrigger触发本地通知)
iOS VoiceOver functionality changes with Bundle Identifier(IOS画外音功能随捆绑包标识符而变化)
tabbar middle tab out of tabbar corner(选项卡栏中间的选项卡角外)
Pushing UIViewController above UITabBar(将UIView控制器推送到UITabBar上方)
Dropbox Files.download does not start when number of files in folder is gt; 1000(当文件夹中的文件数为1000时,Dropbox Files.Download不会启动)
How can I sync two flatList scroll position in react native(如何在本机Reaction中同步两个平面列表滚动位置)