Я работаю над видео приложением. Я хочу сбросить видеокадры, когда камера автофокусируется. Во время автофокусировки захваченное изображение становится размытым, и обработка изображения для этого кадра становится плохой, но после завершения автофокусировки обработка изображения становится превосходной. Любое тело дает мне решение?
Обнаружение автофокусировки камеры
Ответы (4)
adjustingFocus
имущество.
Указывает, настраивает ли устройство в данный момент настройки фокусировки. (только для чтения)
*Примечания. Вы можете наблюдать за изменениями значения этого свойства, используя наблюдение за значением ключа.
iOS 4.0 и выше
Ниже приведен пример кода в Swift 3.x.
Сначала необходимо добавить наблюдателя к выбранному устройству захвата при инициализации камеры.
captureDevice.addObserver(self, forKeyPath: "adjustingFocus", options: [.new], context: nil)
Затем методObservValue переопределяется. Обращаясь к необязательному значению, возвращаемому методом, можно идентифицировать кадры автофокусировки.
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
guard let key = keyPath, let changes = change else {
return
}
if key == "adjustingFocus" {
let changedValue = changes[.newKey]
if (changedValue! as! Bool){
// camera is auto-focussing
}else{
// camera is not auto-focussing
}
}
}
Пример на Swift 4+
class ViewController: UIViewController, AVCapturePhotoCaptureDelegate {
//@objc var captureDevice: AVCaptureDevice?
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.addObservers()
}
func addObservers() {
self.addObserver(self, forKeyPath: "captureDevice.adjustingFocus", options: .new, context: nil)
}
func removeObservers() {
self.removeObserver(self, forKeyPath: "captureDevice.adjustingFocus")
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "captureDevice.adjustingFocus" {
print("============== adjustingFocus: \(self.captureDevice?.lensPosition)")
}
} //End of class
Наблюдение за adjustingFocus
не работает для меня. Это всегда нет. И я нахожу это.
Обратите внимание, что когда используется традиционная автофокусировка с определением контраста, свойство AVCaptureDevice AdjustingFocus переключается на YES, когда выполняется фокусировка, и переключается обратно на NO, когда это делается. Когда используется автофокусировка с определением фазы, для свойства AdjustingFocus не устанавливается значение YES, поскольку метод определения фазы имеет тенденцию фокусироваться чаще, но в небольших, иногда незаметных количествах. Вы можете просмотреть свойство LensPosition AVCaptureDevice, чтобы увидеть движения объектива, которые управляются автофокусировкой с определением фазы.
от Apple
Я еще не пробовал, я попробую и обновлю позже.
Редактировать. Я пробовал это и подтверждаю, что это правильно.