使用其他后台音频播放时设置MPNowPlayingInfoCenter

17

我正在尝试使用MPMoviePlayerController在Swift的iOS应用中播放视频。

我的目标是能够使用类似于Apple Music的系统音乐播放,并打开我的应用程序,让音频混合,但是我希望我的应用程序能够控制MPNowPlayingInfoCenter。

如何在使用AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, withOptions: .MixWithOthers)的同时设置MPNowPlayingInfoCenter?

Google Maps在设置MPNowPlayingInfoCenter的同时混合音频。以下是我尝试设置MPNowPlayingInfoCenter的方式:

func setMeta(){
    UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
    self.becomeFirstResponder()
    if let player = PlayWorkoutViewController.player{
        let coverArt = MPMediaItemArtwork(image: UIImage(named: "AlbumArt")!)
        let dict: [String: AnyObject] = [
            MPMediaItemPropertyArtwork: coverArt,
            MPMediaItemPropertyTitle:workout.title,
            MPMediaItemPropertyArtist:"Alex",
            MPMediaItemPropertyAlbumTitle:workout.program.title,
            MPNowPlayingInfoPropertyPlaybackRate: player.currentPlaybackRate,
            MPNowPlayingInfoPropertyElapsedPlaybackTime: player.currentPlaybackTime,
            MPMediaItemPropertyPlaybackDuration: player.playableDuration
        ]
        MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo = dict
    }
}

上述函数在我不尝试使用选项(.MixWithOthers)同时播放外部音乐时有效,但是当我尝试使用选项(.MixWithOthers)播放外部音乐时,信息中心不会更新。

编辑1:为了让事情更加清晰,我已经成功地进行视频播放,现在尝试在能够设置MPNowPlayingInfoCenter的同时播放其他背景音频。

3个回答

10

目前在 iOS 平台上还无法实现此功能。即使只是将您的分类选项更改为 .MixWithOthers,也会忽略您的 nowPlayingInfo 信息。

我的猜测是 iOS 只考虑不混音的应用程序包含在 MPNowPlayingInfoCenter 中,因为存在多个混音应用程序同时播放时,在(例如)控制中心中会出现哪个应用程序是不确定的。

如果 iOS 使用类似以下的“最佳尝试”方法来选择“正在播放的应用程序”,那就太好了:

  1. 如果有一个没有混音的应用程序在播放,则选择该应用程序。否则……
  2. 如果只有一个混音应用程序在播放,则选择该应用程序。否则……
  3. 如果有多个混音应用程序在播放,只需选择一个 :) 或者不选任何一个,我都可以接受。

如果您也希望拥有这种行为,请鼓励您向 Apple 提交错误报告。


0

你有尝试过自己实现一个自定义函数来更新MPNowPlayingInfoCenter吗?最近我在使用AVAudioPlayer播放音乐时,需要手动进行更新。

基本上这就是我在加载新歌曲时调用的函数。

func updateNowPlayingCenter() {
    let center = MPNowPlayingInfoCenter.defaultCenter()
    if nowPlayingItem == nil {
        center.nowPlayingInfo = nil
    } else {
        var songInfo = [String: AnyObject]()

        // Add item to dictionary if it exists
        if let artist = nowPlayingItem?.artist {
            songInfo[MPMediaItemPropertyArtist] = artist
        }
        if let title = nowPlayingItem?.title {
            songInfo[MPMediaItemPropertyTitle] = title
        }
        if let albumTitle = nowPlayingItem?.albumTitle {
            songInfo[MPMediaItemPropertyAlbumTitle] = albumTitle
        }
        if let playbackDuration = nowPlayingItem?.playbackDuration {
            songInfo[MPMediaItemPropertyPlaybackDuration] = playbackDuration
        }
        if let artwork = nowPlayingItem?.artwork {
            songInfo[MPMediaItemPropertyArtwork] = artwork
        }
        center.nowPlayingInfo = songInfo
    }
}

我不确定在电影加载时这样做是否会覆盖MPMoviePlayerController,但这似乎值得一试。

此外,他们已经弃用了MPMoviePlayerController并用AVPlayerViewController替换了它,所以这也值得研究。

编辑:还要检查确保您正确接收远程控制事件,因为这会影响信息中心显示的数据。


你好,感谢您的回复。我已经更新了问题。问题不是正常设置信息中心,而是在使用.MixWithOthers选项播放音乐时设置信息中心。 - Alex Pelletier

-2

要在Swift中播放视频,请使用以下代码:

func playVideoEffect() {
    let path = NSBundle.mainBundle().pathForResource("egg_grabberAnmi", ofType:"mp4")
    let url = NSURL.fileURLWithPath(path!)
    self.moviePlayer = MPMoviePlayerController(contentURL: url)
    if let player = moviePlayer {
        let screenSize: CGRect = UIScreen.mainScreen().bounds
        player.view.frame = CGRect(x: frame.size.width*0.10,y: frame.size.width/2, width:screenSize.width * 0.80, height: screenSize.width * 0.80)
        player.view.sizeToFit()
        player.scalingMode = MPMovieScalingMode.Fill
        player.fullscreen = true
        player.controlStyle = MPMovieControlStyle.None
        player.movieSourceType = MPMovieSourceType.File
        player.play()
        self.view?.addSubview(player.view)
        var timer = NSTimer.scheduledTimerWithTimeInterval(6.0, target: self, selector: Selector("update"), userInfo: nil, repeats: false)     
    }
}


// And Use the function to play Video
playVideoEffect()

是的,我们可以 :- var url:NSURL = NSURL(string: "您的URL") - Raksha Saini
@Raksha,我觉得你完全没有理解问题。我已经知道如何播放视频,请重新阅读问题。 - Alex Pelletier

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