3

我正在使用 AVKit 向用户展示视频。

当用户选择一个视频时,它会使用 AVKit 的标准播放器呈现。这使它成为全屏。

如果用户选择将其设为“画中画”,则用户能够继续使用应用程序的其余部分。

这意味着用户可以选择另一个视频来播放,该视频确实与之前在画中画中仍然可见的视频同时播放(全屏)。

我想在选择第二个视频时关闭第一个(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)

...
4

1 回答 1

3

好的,这就是我解决它的方法:

  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。

IE

(只是对于那些还不知道的人),这里是 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 
    })
}
于 2019-09-29T17:00:47.297 回答