Fix: use Timer for video capture, set isRunning before capture loop
This commit is contained in:
parent
6c31894a6d
commit
cbc03b40b4
@ -88,6 +88,7 @@ final class PlayerRecorder: NSObject {
|
||||
|
||||
// 启动视频抓帧
|
||||
isRecording = true
|
||||
isRunning = true // 必须在 startCaptureLoop 之前设置
|
||||
startTimer()
|
||||
startCaptureLoop()
|
||||
|
||||
@ -100,6 +101,8 @@ final class PlayerRecorder: NSObject {
|
||||
guard isRecording else { return }
|
||||
isRecording = false
|
||||
isRunning = false
|
||||
captureTimer?.invalidate()
|
||||
captureTimer = nil
|
||||
stopTimer()
|
||||
stopAudioCapture()
|
||||
|
||||
@ -117,13 +120,13 @@ final class PlayerRecorder: NSObject {
|
||||
}
|
||||
|
||||
// MARK: - 视频抓帧
|
||||
private var captureTimer: Timer?
|
||||
|
||||
private func startCaptureLoop() {
|
||||
guard let vInput = videoInput else { return }
|
||||
let queue = DispatchQueue(label: "recorder.video.capture")
|
||||
vInput.requestMediaDataWhenReady(on: queue) { [weak self] in
|
||||
guard let self = self, self.isRunning else { return }
|
||||
// 用 Timer 每 1/30 秒抓一帧
|
||||
captureTimer = Timer.scheduledTimer(withTimeInterval: 1.0 / 30.0, repeats: true) { [weak self] _ in
|
||||
Task { @MainActor in
|
||||
self.captureVideoFrame()
|
||||
self?.captureVideoFrame()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user