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
|
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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user