AVCam: Увеличить еще больше (как это возможно для фоторежима)?

Использование XCode-6.4, iOS-8.4.1:

С помощью AVCaptureSession я хотел бы увеличить масштаб еще больше (насколько камера iPhone может справиться!)

Я уже использую метод setVideoZoomFactor, установленный равным 1 (= наименьшее допустимое значение). Это работает довольно хорошо (см. пример кода в самом низу...). Но затем я сделал следующее наблюдение (признав, что камера в фоторежиме, возможно, умудряется увеличивать масштаб даже дальше, чем в видеорежиме):

Камера iPhone в фоторежиме показывает совсем другой зум, чем камера в видеорежиме (по крайней мере, для моего iPhone 5S). Вы можете проверить себя, используя родное приложение «Камера» на вашем iPhone. Переключитесь между ФОТО и ВИДЕО, и вы увидите, что фоторежим может увеличить масштаб больше, чем видео-зумфактор = 1). Как это возможно???

И, кроме того, есть ли способ добиться того же минимального коэффициента масштабирования, которого фото-режим достигает и в видео-режиме, используя AVCam под iOS????

Вот иллюстрация того, какая разница в масштабировании между фото- и видеорежимом моего iPhone 5S (см. рисунок):

введите здесь описание изображения

Вот код AVCamViewController:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Create the AVCaptureSession
    AVCaptureSession *session = [[AVCaptureSession alloc] init];
    [self setSession:session];

    // Setup the preview view
    [[self previewView] setSession:session];

    // Check for device authorization
    [self checkDeviceAuthorizationStatus];

    dispatch_queue_t sessionQueue = dispatch_queue_create("session queue", DISPATCH_QUEUE_SERIAL);
    [self setSessionQueue:sessionQueue];

    // http://stackoverflow.com/questions/25110055/ios-captureoutputdidoutputsamplebufferfromconnection-is-not-called

    dispatch_async(sessionQueue, ^{
        self.session = [AVCaptureSession new];
        self.session.sessionPreset = AVCaptureSessionPresetMedium;
        NSArray *devices = [AVCaptureDevice devices];
        AVCaptureDevice *backCamera;
        for (AVCaptureDevice *device in devices) {
            if ([device hasMediaType:AVMediaTypeVideo]) {
                if ([device position] == AVCaptureDevicePositionBack) {
                    backCamera = device;
                }
            }
        }

        NSError *error = nil;
        AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:backCamera error:&error];
        if (error) {
            NSLog(@"%@",error);
        }
        if ([self.session canAddInput:input]) {
            [self.session addInput:input];
        }
        AVCaptureVideoDataOutput *output = [AVCaptureVideoDataOutput new];
        [output setSampleBufferDelegate:self queue:sessionQueue];
        output.videoSettings = @{(id)kCVPixelBufferPixelFormatTypeKey:@(kCVPixelFormatType_32BGRA)};
        if ([self.session canAddOutput:output]) {
            [self.session addOutput:output];
        }

        // Apply initial VideoZoomFactor to the device
        NSNumber *DefaultZoomFactor = [NSNumber numberWithFloat:1.0];
        if ([backCamera lockForConfiguration:&error])
        {
// HERE IS THE ZOOMING DONE !!!!!!
            [backCamera setVideoZoomFactor:[DefaultZoomFactor floatValue]];
            [backCamera unlockForConfiguration];
        }
        else
        {
            NSLog(@"%@", error);
        }

        [self.session startRunning];
    });
}

person iKK    schedule 12.09.2015    source источник


Ответы (1)


Если ваша проблема заключается в том, что ваше приложение масштабирует фотографию по сравнению с собственным приложением камеры iOS, то эта настройка, вероятно, вам поможет. У меня была «эта» проблема, и следующее решение исправило ее.

Решение: настройте сеанс

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Create the AVCaptureSession
    AVCaptureSession *session = [[AVCaptureSession alloc] init];   
    [self setSession:session];
--> self.session.sessionPreset = AVCaptureSessionPresetPhoto;  <---
...
}

Вы должны знать, что настройка будет работать только для фотографий, а не для видео. Если вы попытаетесь использовать видео, ваше приложение вылетит.

Вы можете настроить сеанс в соответствии с вашими потребностями (фото или видео). Для видео вы можете использовать это значение: AVCaptureSessionPresetHigh.

BR.

person CRUS    schedule 26.02.2016