From cbc03b40b4ecbd2d1fbd9be0ec8953e18631c795 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Wed, 24 Jun 2026 20:44:51 +0800 Subject: [PATCH] Fix: use Timer for video capture, set isRunning before capture loop --- Sources/PlayerRecorder.swift | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Sources/PlayerRecorder.swift b/Sources/PlayerRecorder.swift index bb553e4..df83195 100644 --- a/Sources/PlayerRecorder.swift +++ b/Sources/PlayerRecorder.swift @@ -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() } } }