【问题标题】:Close Picture in Picture video when user choses a new video to play当用户选择要播放的新视频时关闭画中画视频
【发布时间】:2020-01-28 17:28:44
【问题描述】:

我正在使用 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)

...

【问题讨论】:

    标签: ios swift video avkit picture-in-picture


    【解决方案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。

    (仅针对那些还不知道的人),这里是 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 
        })
    }
    

    【讨论】:

    • 我遇到了同样的问题,我不清楚您的解决方案。你如何真正杀死现有的画中画?
    • @RMoyer 您只需按照 Apple 在其代码/教程中演示的标准方式即可。暂停播放器并清除所有引用并关闭 AVPVC。
    • @RMoyer 我已经修改了答案以包含一个示例 Kill 方法。
    • @iOSProgrammingIsFun 你有没有想出另一个不使用计时器的解决方案?
    • @AlejandroCotilla 是的。我上面的回答。
    最近更新 更多