Закрыть видео «картинка в картинке», когда пользователь выбирает новое видео для воспроизведения

Я использую AVKit для показа видео пользователю.

Когда пользователь выбирает видео, оно отображается с помощью стандартного проигрывателя из AVKit. Это делает его полноэкранным.

Если пользователь выбирает режим «Картинка в картинке», он может продолжать использовать остальную часть приложения.

Это означает, что пользователь может выбрать другое видео для воспроизведения, которое действительно воспроизводится (в полноэкранном режиме) одновременно с предыдущим видео, которое все еще отображается на картинке в картинке.

Я хотел бы закрыть первое (PiP) видео, когда выбрано второе видео, однако перед запуском второго видео я пытаюсь «отклонить» предыдущее, но это не работает.

Я думаю, это потому, что он отображается как PiP, поэтому AVPlayerViewController больше его не представляет...

Есть ли способ сделать это просто?

Воспроизведение видео с (не работающей) попыткой убить первое видео, если второе пытается воспроизвести:

func play(FileName filename: String, FileType type: String)
{
    if self.isVideoPlaying == YES
    {
       self.playerController!.dismiss(animated: YES, completion: { self.isVideoPlaying = NO ; self.play(FileName: filename, FileType: type) })

       return
    }

    self.isVideoPlaying = YES

    let path = Bundle.main.path(forResource: filename, ofType: type)

    let url = NSURL(fileURLWithPath: path!)

    let player = AVPlayer(url: url as URL)

...

person iOSProgrammingIsFun    schedule 28.09.2019    source источник


Ответы (1)


Хорошо, вот как я это решил:

  1. Имейте свойство класса «isAlreadyPlaying: Bool», которое вы устанавливаете при воспроизведении видео... однако

  2. В методе, где вы «воспроизводите» видео и представляете AVPlayerViewController с (новым) видео, сначала проверьте эту проверку:


if self.isAlreadyPlaying == YES
{
     killVideoPlayer()

     DispatchQueue.main.asyncAfter(deadline: .now() + 1.5, execute: { self.play(FileName: filename, FileType: type) })

     return
}

... Here you put the normal play / present code

А в методе killVideoPlayer() установите для свойства isAlreadyPlaying значение NO/false.

i.e.

(Только для тех, кто еще не знает), вот функция kill:

private func killVideoPlayer()
{
    self.isAlreadyPlaying          = NO

    self.playerController?.player?.pause()
    self.playerController?.player  = nil

    let audioSession = AVAudioSession.sharedInstance()

    do
    {
        try audioSession.setActive(false, options: .notifyOthersOnDeactivation)
        try audioSession.setCategory(.soloAmbient)
    }
    catch
    {
        print("Audio session failed")
    }

    self.playerController?.dismiss(animated: YES, completion: 
    { 
        self.playerController = nil 
    })
}
person iOSProgrammingIsFun    schedule 29.09.2019
comment
У меня такая же проблема, и ваше решение мне не ясно. Как вы на самом деле убиваете существующую картинку в картинке? - person R Moyer; 16.01.2020
comment
@RMoyer Вы просто делаете это стандартным способом, который Apple демонстрирует в своем коде / учебниках. Приостановите проигрыватель, обнулите все ссылки и закройте AVPVC. - person iOSProgrammingIsFun; 17.01.2020
comment
@RMoyer Я исправил ответ, включив в него пример метода Kill. - person iOSProgrammingIsFun; 17.01.2020
comment
@iOSProgrammingIsFun Вы нашли другое решение без использования таймера? - person Alejandro Cotilla; 11.01.2021
comment
@АлехандроКотилья Да. Мой ответ выше. - person iOSProgrammingIsFun; 12.01.2021