Использование 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];
});
}