45 lines
1.7 KiB
Swift
45 lines
1.7 KiB
Swift
import AVFoundation
|
|
import Foundation
|
|
|
|
/// AVCaptureMovieFileOutput may finish with a non-nil error while explicitly
|
|
/// reporting that the movie file itself was completed successfully.
|
|
enum VideoNoteRecordingCompletionPolicy {
|
|
static func shouldKeepOutput(for error: Error?) -> Bool {
|
|
guard let error else { return true }
|
|
let value = error as NSError
|
|
if value.domain == AVFoundationErrorDomain,
|
|
value.code == AVError.Code.maximumDurationReached.rawValue {
|
|
return true
|
|
}
|
|
if let finished = value.userInfo[AVErrorRecordingSuccessfullyFinishedKey] as? Bool {
|
|
return finished
|
|
}
|
|
return (value.userInfo[AVErrorRecordingSuccessfullyFinishedKey] as? NSNumber)?.boolValue
|
|
== true
|
|
}
|
|
|
|
/// A camera interruption may still leave a playable partial movie. That
|
|
/// file is useful for recovery, but it must not be sent as though the user
|
|
/// released the record button. The 60-second capture limit is the only
|
|
/// completion that is expected without an explicit stop request.
|
|
static func wasRequestedOrReachedLimit(
|
|
stopRequested: Bool,
|
|
error: Error?,
|
|
recordedDuration: TimeInterval,
|
|
maximumDuration: TimeInterval
|
|
) -> Bool {
|
|
if stopRequested { return true }
|
|
|
|
if let error,
|
|
(error as NSError).domain == AVFoundationErrorDomain,
|
|
(error as NSError).code == AVError.Code.maximumDurationReached.rawValue {
|
|
return true
|
|
}
|
|
|
|
guard recordedDuration.isFinite,
|
|
maximumDuration.isFinite,
|
|
maximumDuration > 0 else { return false }
|
|
return recordedDuration >= maximumDuration - 0.25
|
|
}
|
|
}
|