录制结束后从临时目录播放的AVPlayer视频播放几秒钟后停止。

3

我有一台自定义相机,可以录制视频和拍照。问题在于,录制并推送包含录制视频预览的视图控制器后,视频几秒后停止播放。

流程如下:

  1. 打开自定义相机;
  2. 录制视频;
  3. 显示包含录制视频预览的控制器(通过pushViewController(controller, animated: true));
  4. 视频开始播放;
  5. N秒后(1-2秒),由于某种原因视频停止。

代码如下:

  1. didFinishRecordingTo outputFileURL:
        if let error = error {
            // handle error
            return
        }

        if let currentBackgroundRecordingID = backgroundRecordingID {
            backgroundRecordingID = UIBackgroundTaskIdentifier.invalid

            if currentBackgroundRecordingID != UIBackgroundTaskIdentifier.invalid {
                UIApplication.shared.endBackgroundTask(currentBackgroundRecordingID)
            }
        } 
       // open viewController and play recently recorded video from temporary files.
  1. setupVideoBackground() -> 在viewDidLoad/viewWillAppear中调用的AVPlayer配置函数。
        let player = AVPlayer(url: url)
        player.actionAtItemEnd = .none

        let playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = self.view.frame
        playerLayer.videoGravity = .resizeAspectFill

        self.view.layer.insertSublayer(playerLayer, at: 0)

        player.seek(to: .zero)
        player.play()

推送视图控制器:
        let vc = TestController()
        vc.url = url!
        self.navigationController?.pushViewController(vc, animated: true)   

注意:一个奇怪的现象是,如果我使用animated:false调用pushViewController,则播放器将播放完整视频;如果使用animated:true,则视频将在几秒钟后停止播放。此外,使用“present view controller”功能完美。
注意2:如果我使用DispatchQueue并延迟0.5秒调用setupVideoBackground()方法,则视频不会停止。
我不理解为什么在调用pushViewController(vc, animated: false)后视频可以正确播放,但在调用pushViewController(vc, animated: true)后视频会停止播放。

它是否在动画完成时立即停止?您尝试过在动画完成后启动视频吗? - Frank Rupprecht
@FrankSchlegel 你所说的“动画”是指pushViewController提供的动画吗? - Rodion Kuskov
好的。看起来它某种程度上与此相关... - Frank Rupprecht
@FrankSchlegel 我下载了一些类似的相机和视频录制/预览项目,它们使用与我的方法相同的方法,所以我很困惑,因为代码几乎完全相同.. - Rodion Kuskov
奇怪...你可以尝试使用KVO来观察播放器的“rate”,在回调中设置断点并检查堆栈以了解更改的原因。 - Frank Rupprecht
@FrankSchlegel 我注意到当动画为真时,timeControlStatus 会返回waitingToPlayAtSpecifiedRate几次,然后返回paused值。这意味着rate值为0.0。现在我需要理解为什么速率变成了0.0。 - Rodion Kuskov
1个回答

2
解决方案1: 问题出在相机界面的viewDidDisappear方法中。其中有一个cameraSession.stopSession()。每次调用stopSession时,AVPlayer都会停止播放。我不知道为什么和怎么样AVCaptureSession.stopSession()AVPlayer相关联,但是从viewDidDissapear中删除cameraSession.stopSession()即可解决该问题。 解决方案2: 您可以将AVAudioSession类别设置为.playAndRecord,这样视频就可以正确播放: try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .videoRecording, options: [.mixWithOthers])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接