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.
代码:
1
2 3 4 5 6 7 8 9 10 11 12 13 |
if let error = error {
// handle error return } if let currentBackgroundRecordingID = backgroundRecordingID { if currentBackgroundRecordingID != UIBackgroundTaskIdentifier.invalid { |
1
2 3 4 5 6 7 8 9 10 11 |
let player = AVPlayer(url: url)
player.actionAtItemEnd = .none let playerLayer = AVPlayerLayer(player: player) self.view.layer.insertSublayer(playerLayer, at: 0) player.seek(to: .zero) |
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)
之后停止播放
- 动画完成后它可能会停止吗?您是否尝试过在动画完成后开始播放视频?
- @FrankSchlegel 的”动画”是指 pushViewController 提供的动画吗?
- 对。好像有什么关系……
- @FrankSchlegel我下载了类似的带有相机和视频录制/预览的项目,它们使用与我相同的方法,所以我很困惑,因为代码几乎完全相同..
- 奇怪的€|您可以尝试使用 KVO 观察播放器的 rate,在回调中设置断点并检查堆栈以了解更改的原因。
- @FrankSchlegel 我注意到当动画为真时, timeControlStatus 返回 waitingToPlayAtSpecifiedRate 几次,然后返回 paused 值。所以这意味着 rate 的值为 0.0。现在我需要了解,为什么 rate 变成 0.0
解决方案 1:
所以问题出在相机屏幕上的 viewDidDissapear 中。有一个 cameraSession.stopSession()。每次调用 stopSession 时,avplayer 都会停止播放。我不知道 AVCaptureSession.stopSession() 为什么以及如何与 AVPlayer 相关,但是从 viewDidDissapear 中删除 cameraSession.stopSession() 解决了这个问题。
解决方案 2:
您可以将 AVAudioSession 类别设置为 .playAndRecord 并且视频将正确播放:
try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .videoRecording, options: [.mixWithOthers])
来源:https://www.codenong.com/60150449/