Установите MPNowPlayingInfoCenter с другим фоновым звуком
Я пытаюсь воспроизвести видео с помощью MPMoviePlayerController для приложения iOS в Swift.
Моя цель - играть в системную музыку с чем-то вроде яблочной музыки, затем открывать мое приложение и включать аудио-микширование, но я хочу, чтобы мое приложение могло взять под свой контроль 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.
Ответы
Ответ 1
В настоящее время это невозможно в iOS. Даже просто изменяя параметры своей категории на .MixWithOthers
вы nowPlayingInfo
.
Я предполагаю, что iOS рассматривает приложения без микширования для включения в MPNowPlayingInfoCenter
, потому что существует неопределенность в отношении того, какое приложение будет отображаться в (например) Центре управления, если одновременно есть несколько приложений для микширования.
Мне очень понравилось бы, если бы iOS использовал наилучший подход для выбора "теперь играющего приложения", примерно так:
- Если есть приложение для микширования, выберите это. Else..
- Если есть только одно приложение для микширования, выберите это. Else..
- Если есть несколько приложений для микширования, просто выберите один :) Или выберите ни одного, я тоже в порядке.
Если вам тоже понравится это поведение, я бы посоветовал вам записать ошибку с Apple.
Ответ 2
Пробовали ли вы реализовать свою собственную функцию для обновления 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, так что также стоит посмотреть.
Изменить. Также я бы проверял, чтобы вы правильно получали события дистанционного управления, так как это влияет на данные, отображаемые информационным центром.
Ответ 3
Чтобы быстро воспроизвести видео, выполните следующие действия: -
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()