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 isRecording = true
isRunning = true // startCaptureLoop
startTimer() startTimer()
startCaptureLoop() startCaptureLoop()
@ -100,6 +101,8 @@ final class PlayerRecorder: NSObject {
guard isRecording else { return } guard isRecording else { return }
isRecording = false isRecording = false
isRunning = false isRunning = false
captureTimer?.invalidate()
captureTimer = nil
stopTimer() stopTimer()
stopAudioCapture() stopAudioCapture()
@ -117,13 +120,13 @@ final class PlayerRecorder: NSObject {
} }
// MARK: - // MARK: -
private var captureTimer: Timer?
private func startCaptureLoop() { private func startCaptureLoop() {
guard let vInput = videoInput else { return } // Timer 1/30
let queue = DispatchQueue(label: "recorder.video.capture") captureTimer = Timer.scheduledTimer(withTimeInterval: 1.0 / 30.0, repeats: true) { [weak self] _ in
vInput.requestMediaDataWhenReady(on: queue) { [weak self] in
guard let self = self, self.isRunning else { return }
Task { @MainActor in Task { @MainActor in
self.captureVideoFrame() self?.captureVideoFrame()
} }
} }
} }