Fix: use Timer for video capture, set isRunning before capture loop

This commit is contained in:
yumoqing 2026-06-24 20:44:51 +08:00
parent 6c31894a6d
commit cbc03b40b4

View File

@ -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()
}
}
}