У меня проблемы с блокировкой точки фокусировки и фотографией со вспышкой на iPhone X (iOS 12.0) с использованием набора AVFoundation.Как правильно заблокировать фокус на iOS 10 и выше?
Мне нужно сделать снимок со вспышкой, но не допускать срабатывания автофокуса. Мне нужно определенное положение объектива во время захвата.
Я сделал самое простое приложение, которое позволяет поворачивать вспышкупри использовании объекта AVCapturePhotoSettings блокирует фокус на AVCaptureDevice с помощью [device setFocusMode:AVCaptureFocusModeLocked]
, а затем делает снимок с помощью capturePhotoWithSettings .
Независимо отблокировка фокуса, автоматическая фокусировка все еще часто происходит, особенно когда предварительный просмотр не в фокусе.Я пропустил какие-либо настройки или новый способ блокировки фокуса?
Я также попытался добавить setFocusModeLockedWithLensPosition , который корректно перемещает положение объектива, но за ним по-прежнему следует автофокус.
Есть ли в магазине приложение, которое может успешно заблокировать фокус во время фотовспышки?
// ViewController.h
//#import <UIKit/UIKit.h>
//
//@interface ViewController : UIViewController <AVCapturePhotoCaptureDelegate>
//
//@end
#import <AVFoundation/AVFoundation.h>
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic) AVCaptureSession *session;
@property (nonatomic) AVCapturePhotoOutput *stillImageOutput;
@property (nonatomic) AVCaptureVideoPreviewLayer *videoPreviewLayer;
@property (weak, nonatomic) IBOutlet UIView *preview_view;
@property (weak, nonatomic) IBOutlet UIButton *take_picture_btn;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
-(void) viewDidAppear:(BOOL)animated
{
self.session = [[AVCaptureSession alloc] init];
self.session.sessionPreset = AVCaptureSessionPresetMedium;
self.videoPreviewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
self.videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspect;
self.videoPreviewLayer.connection.videoOrientation = AVCaptureVideoOrientationPortrait;
[self.preview_view.layer addSublayer:self.videoPreviewLayer];
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput* deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:NULL];
[self.session addInput:deviceInput];
self.stillImageOutput = [AVCapturePhotoOutput new];
[self.session addOutput:self.stillImageOutput];
[self.session commitConfiguration];
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(globalQueue, ^{
[self.session startRunning];
dispatch_async(dispatch_get_main_queue(), ^{
self.videoPreviewLayer.frame = self.preview_view.bounds;
});
});
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self.session stopRunning];
}
- (IBAction)take_picture:(id)sender {
AVCapturePhotoSettings *settings = [AVCapturePhotoSettings photoSettings];
settings.flashMode = AVCaptureFlashModeOn;
AVCaptureDevice* device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
[device lockForConfiguration:nil];
[device setFocusMode:AVCaptureFocusModeLocked];
[device unlockForConfiguration];
[self.stillImageOutput capturePhotoWithSettings:settings delegate:self];
}
- (void)captureOutput:(AVCapturePhotoOutput *)output didFinishProcessingPhoto:(AVCapturePhoto *)photo error:(nullable NSError *)error {
NSData *imageData = photo.fileDataRepresentation;
if (imageData) {
UIImage *image = [UIImage imageWithData:imageData];
UIImageWriteToSavedPhotosAlbum(image,nil,nil,nil);
}
}
@end
UDPATE: Я прошел техническую поддержку Apple.Они признали это ошибкой в API на iPhone 8 и выше.Автофокус не корректно обходится при фиксировании положения объектива.Начиная с iOS 12.1.4, это все еще проблема, но с надеждой на исправление.Работы пока не найдено.