传递给不同控制器时 AVPlayer 持续时间会发生变化

Posted

技术标签:

【中文标题】传递给不同控制器时 AVPlayer 持续时间会发生变化【英文标题】:AVPlayer duration changes when passed to differrent controller 【发布时间】:2018-11-20 13:53:44 【问题描述】:

我在集合视图单元格中有一个带有 AVPlayer 的控制器。当方向更改为横向时,播放器应获得全屏。

为此,我在 Collection View Cell 中展示了一个具有相同播放器实例的 AVPlayerController。视频在播放模式下旋转时效果很好。 但是,当视频暂停并且我将方向更改为横向时,当前时刻的帧会发生变化,即视频向前移动。

我已经测试过,即使方向保持不变,当玩家通过时,持续时间也会跳过几秒钟。

代码如下:

在存在单元格的 ViewController 中。

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) 
    super.viewWillTransition(to: size, with: coordinator)

    guard let videoCell = contentGalleryController.curatorVideoCell else return
    if UIDevice.current.orientation == .landscapeLeft || UIDevice.current.orientation == .landscapeRight 
        let player = videoCell.getVideoPlayer
        playerViewController = (storyboard!.instantiateViewController(withIdentifier: "FullScreenPlayerController") as! FullScreenPlayerController)
        playerViewController?.player = player
        playerViewController?.didPlayedToEnd = videoCell.isVideoFinishedPlaying ?? false
        playerViewController?.isMuteTurnedOn = player.isMuted
        let wasVideoPlaying: Bool = player.isPlaying
        present(playerViewController!, animated: false)
            if wasVideoPlaying 
                player.play()
            
        
    
    else 
        videoCell._setMuteIcon()
        videoCell._setPlayPauseIcon()
        playerViewController?.dismiss(animated: false, completion: nil)
    

在 FullscreenPlayer 视图控制器中

override func viewDidLoad() 
        super.viewDidLoad()
        setPlayPauseIcon()
        setMuteIcon()

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(customControlViewTapped))
        customView.addGestureRecognizer(tapGesture)
    

    override func viewDidLayoutSubviews() 
        super.viewDidLayoutSubviews()

        if !view.subviews.contains(customView) 
            customView.frame = view.bounds
            view.addSubview(customView)
        
    

    override func viewDidAppear(_ animated: Bool) 
        super.viewDidAppear(animated)
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidPlayToEnd), name: Notification.Name.AVPlayerItemDidPlayToEndTime, object: player?.currentItem)
    

    override func viewDidDisappear(_ animated: Bool) 
        super.viewDidDisappear(animated)
        NotificationCenter.default.removeObserver(self)
    

我在控制器中什么也没做。

截图: 肖像

风景

当方向改变时,即使处于暂停状态,视频也会向前移动。

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

您应该尝试捕获currentTime,然后在播放器上使用seek(to time: CMTime) 方法在该确切时间开始。我不确定为什么会发生这种情况,但我认为这会让你得到你想要的结果。

【讨论】:

我已经尝试过寻找,但我无法寻找确切的位置。因为差异以毫秒为单位。 您熟悉 CMTime 的工作原理吗?您可以提供确切的时间。 developer.apple.com/documentation/coremedia/cmtime-u58 如果你在方向改变时得到 player.currentTime,你可以寻找那个时间。对于两个公差,请使用 seek(to:toleranceBefore:toleranceAfter:) 和 kCMTimeZero 进行精确搜索。 我也使用了容差,但是从纵向移动到横向时,框架会有轻微的位移。 @bhatejaud 你能提供更新的代码来捕捉时间然后用它来玩吗?

以上是关于传递给不同控制器时 AVPlayer 持续时间会发生变化的主要内容,如果未能解决你的问题,请参考以下文章

持续时间不是来自AVPlayer currentItem

AVPlayer 项目的持续时间为 nan

当视频从所有屏幕完成时自动关闭 AVPlayer

AVPlayer url持续时间Xcode 12 [关闭]

iOS 7中的iOS 7 AVPlayer AVPlayerItem持续时间不正确

使用 MPRemoteCommandCenter 为 AVPlayer 和 AVAudioPlayer 添加当前时间和持续时间的位置