Установите MPNowPlayingInfoCenter с воспроизведением другого фонового звука

Я пытаюсь воспроизвести видео с помощью MPMoviePlayerController для приложения iOS в Swift.

Моя цель состоит в том, чтобы иметь возможность воспроизводить системную музыку с чем-то вроде Apple Music, затем открывать мое приложение и смешивать аудио, но я хочу, чтобы мое приложение могло взять под контроль MPNowPlayingInfoCenter.

Как я могу использовать AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, withOptions: .MixWithOthers) при установке MPNowPlayingInfoCenter?

Карты 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.


person Alex Pelletier    schedule 02.01.2016    source источник


Ответы (3)


В настоящее время это невозможно в iOS. Даже простое изменение параметров вашей категории на .MixWithOthers приводит к тому, что ваш nowPlayingInfo игнорируется.

Я предполагаю, что iOS рассматривает только приложения без микширования для включения в MPNowPlayingInfoCenter, потому что существует неопределенность в отношении того, какое приложение будет отображаться (например) в Центре управления, если одновременно воспроизводятся несколько микширующих приложений.

Мне бы очень хотелось, чтобы iOS использовала максимальные усилия для выбора «приложения, которое сейчас воспроизводится», что-то вроде этого:

  1. Если играет приложение без микширования, выберите его. Еще..
  2. Если играет только одно приложение для микширования, выберите его. Еще..
  3. Если воспроизводится несколько приложений для микширования, просто выберите одно :) Или не выбирайте ни одного, меня устраивает и то, и другое.

Если вам тоже нравится такое поведение, я рекомендую вам сообщить об ошибке в Apple.

person Giorgio Calderolla    schedule 12.01.2016

Вы пытались реализовать свою собственную функцию для обновления 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, так что на это тоже стоит обратить внимание.

Редактировать: Также я хотел бы убедиться, что вы правильно получаете события удаленного управления, так как это влияет на данные, отображаемые информационным центром.

person rikola    schedule 06.01.2016
comment
Здравствуйте, спасибо за ваш ответ. Я обновил вопрос. Проблема заключается не в том, чтобы настроить информационный центр в обычном режиме, а в том, чтобы настроить информационный центр во время воспроизведения музыки с опцией .MixWithOthers. - person Alex Pelletier; 06.01.2016

Чтобы быстро воспроизвести видео, используйте это: -

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()
person Raksha Saini    schedule 11.01.2016
comment
да, мы можем :- var url: NSURL = NSURL (строка: ваш URL) - person Raksha Saini; 11.01.2016
comment
@Raksha Я думаю, ты полностью пропустил вопрос. Я уже знаю, как воспроизводить видео, пожалуйста, перечитайте вопрос. - person Alex Pelletier; 11.01.2016