I created a screen recording app.
Before appending the buffer to the writer, I check if the isReadyForMoreMediaData
is true
.
But sometimes it will constantly return false
and won’t become true
until I call markAsFinished
I have no idea how to fix this.
let videoCompressionProperties = [
AVVideoAverageBitRateKey: resolution.dataRate
]
let videoSettings: [String: Any] = [
AVVideoCodecKey: encoding,
AVVideoWidthKey: resolution.size.width,
AVVideoHeightKey: resolution.size.height,
AVVideoCompressionPropertiesKey: videoCompressionProperties,
AVVideoScalingModeKey: AVVideoScalingModeResizeAspect,
AVVideoColorPropertiesKey: colorSpace.properties.dictionary,
]
videoInput = AVAssetWriterInput(mediaType: .video, outputSettings: videoSettings)
videoInput?.expectsMediaDataInRealTime = true
Append buffers:
if videoInput?.isReadyForMoreMediaData == true {
guard buffer.imageBuffer != nil else { return }
processQueue.async { [self] in
videoInput?.append(buffer)
}
} else {
logger.warning("Dropped a frame.")
// I found this in stackoverflow. But no effect
// RunLoop.current.run(until: .now.addingTimeInterval(0.1))
// The code below will notify me when the bug occurrs.
// errorFixedPublisher.send()
// if !self.errorOccured {
// self.errorOccured = true
// let center = UNUserNotificationCenter.current()
// let content = UNMutableNotificationContent()
// content.sound = UNNotificationSound.defaultCritical
// content.badge = 1
// content.body = "Dropping frames at \(Date.now.formatted(date: .omitted, time: .standard))"
// let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
// let req = UNNotificationRequest(identifier: "ASWRI_ERR", content: content, trigger: trigger)
// center.add(req)
}
}
Any idea on it?? Please help me.
Have a good day!