关于ios:录制后临时目录中的AVPlayer视频几秒钟后停止播放

AVPlayer video from temporary directory after recording stops playing after few seconds

我有一个定制的相机,可以录制视频和拍照。问题是在录制并推送带有录制视频预览的 viewController 后,视频在几秒钟后停止播放。
所以流程是:

  • Custom camera opened;
  • I've recorded a video;
  • Controller with recorded video preview is shown. (by pushViewController(controller, animated: true));
  • Video started playing;
  • After N seconds (1-2 sec) video stopped for some reason.
  • 代码:

  • didFinishRecordingTo outputFileURL:
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            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.
  • setupVideoBackground() -> AVPlayer 的配置,在 viewDidLoad/viewWillAppear 中调用:
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            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()
  • 推送视图控制器:
  • 1
    2
    3
            let vc = TestController()
            vc.url = url!
            self.navigationController?.pushViewController(vc, animated: true)

    注意:一件奇怪的事情是,如果我将 pushViewController 与动画:false 一起使用,那么播放器将播放完整视频,如果动画:true,视频将在几秒钟后停止。此外,当前视图控制器工作正常。

    注意 2:如果我使用 DispatchQueue 以 0.5 秒的延迟调用 setupVideoBackground(),视频将不会停止。

    我不明白,为什么视频在 pushViewController(vc, animated: false) 之后播放正常,而在 pushViewController(vc, animated: true)

    之后停止播放


    解决方案 1:
    所以问题出在相机屏幕上的 viewDidDissapear 中。有一个 cameraSession.stopSession()。每次调用 stopSession 时,avplayer 都会停止播放。我不知道 AVCaptureSession.stopSession() 为什么以及如何与 AVPlayer 相关,但是从 viewDidDissapear 中删除 cameraSession.stopSession() 解决了这个问题。

    解决方案 2:
    您可以将 AVAudioSession 类别设置为 .playAndRecord 并且视频将正确播放:

    try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .videoRecording, options: [.mixWithOthers])