设置 MPNowPlayingInfoCenter 与其他背景音频播放
Set MPNowPlayingInfoCenter with other background audio playing
我正在尝试使用 MPMoviePlayerController 为 Swift 中的 iOS 应用播放视频。
我的目标是能够用 apple music 之类的东西播放系统音乐,然后打开我的应用程序并混入音频,但我希望我的应用程序能够控制 MPNowPlayingInfoCenter
。
如何在设置 MPNowPlayingInfoCenter 的同时使用 AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, withOptions: .MixWithOthers)
?
Google 地图在设置 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。
您是否尝试过实现自己的自定义函数来更新 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,因此这也值得研究。
编辑:我还会检查以确保您正确接收远程控制事件,因为这会影响信息中心显示的数据。
要播放 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()
iOS 目前无法做到这一点。即使只是将您的类别选项更改为 .MixWithOthers
也会导致您的 nowPlayingInfo
被忽略。
我的猜测是 iOS 只考虑将 non-mixing 个应用程序包含在 MPNowPlayingInfoCenter
中,因为不确定哪个应用程序会出现在(例如)控制中心,如果有的话多个混合应用程序同时播放。
如果 iOS 使用 best-effort 方法来选择 "now playing app",我会非常喜欢,像这样:
- 如果正在播放 non-mixing 应用程序,请选择该应用程序。否则..
- 如果只有一个混音应用在播放,请选择那个。否则..
- 如果有多个混合应用程序在播放,只需选择一个 :) 或者选择 none,我都可以。
如果您也喜欢这种行为,我鼓励您向 Apple 提交错误。
我正在尝试使用 MPMoviePlayerController 为 Swift 中的 iOS 应用播放视频。
我的目标是能够用 apple music 之类的东西播放系统音乐,然后打开我的应用程序并混入音频,但我希望我的应用程序能够控制 MPNowPlayingInfoCenter
。
如何在设置 MPNowPlayingInfoCenter 的同时使用 AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, withOptions: .MixWithOthers)
?
Google 地图在设置 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。
您是否尝试过实现自己的自定义函数来更新 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,因此这也值得研究。
编辑:我还会检查以确保您正确接收远程控制事件,因为这会影响信息中心显示的数据。
要播放 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()
iOS 目前无法做到这一点。即使只是将您的类别选项更改为 .MixWithOthers
也会导致您的 nowPlayingInfo
被忽略。
我的猜测是 iOS 只考虑将 non-mixing 个应用程序包含在 MPNowPlayingInfoCenter
中,因为不确定哪个应用程序会出现在(例如)控制中心,如果有的话多个混合应用程序同时播放。
如果 iOS 使用 best-effort 方法来选择 "now playing app",我会非常喜欢,像这样:
- 如果正在播放 non-mixing 应用程序,请选择该应用程序。否则..
- 如果只有一个混音应用在播放,请选择那个。否则..
- 如果有多个混合应用程序在播放,只需选择一个 :) 或者选择 none,我都可以。
如果您也喜欢这种行为,我鼓励您向 Apple 提交错误。