Как заблокировать фокус для захвата флеш фото на iPhone 10, есть ли ошибка api? - PullRequest
0 голосов
/ 29 января 2019

У меня проблемы с блокировкой точки фокусировки и фотографией со вспышкой на 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, это все еще проблема, но с надеждой на исправление.Работы пока не найдено.

...