Как заставить камеру iOS делать снимок программно с помощью AVFoundation?
Мне нужна камера iOS, чтобы сделать снимок без какого-либо участия пользователя. Как бы я поступил так? Это мой код до сих пор:
-(void)initCapture{
AVCaptureDeviceInput *newVideoInput = [[AVCaptureDeviceInput alloc] init];
AVCaptureStillImageOutput *newStillImageOutput = [[AVCaptureStillImageOutput alloc] init];
NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:
AVVideoCodecJPEG, AVVideoCodecKey,
nil];
[newStillImageOutput setOutputSettings:outputSettings];
AVCaptureSession *newCaptureSession = [[AVCaptureSession alloc] init];
if ([newCaptureSession canAddInput:newVideoInput]) {
[newCaptureSession addInput:newVideoInput];
}
if ([newCaptureSession canAddOutput:newStillImageOutput]) {
[newCaptureSession addOutput:newStillImageOutput];
}
self.stillImageOutput = newStillImageOutput;
}
Что еще мне нужно добавить и куда мне идти отсюда? Я не хочу снимать видео, только одно неподвижное изображение. Кроме того, как я мог бы преобразовать изображение в UIImage впоследствии? Спасибо
3 ответа
У вас есть AVCaptureStillImageOutput, stillImageOutput
, Кроме того, вам нужно сохранить сеанс захвата, чтобы вы могли получить его позже. Назови это self.sess
, Затем:
AVCaptureConnection *vc =
[self.stillImageOutput connectionWithMediaType:AVMediaTypeVideo];
[self.sess startRunning];
[self.stillImageOutput captureStillImageAsynchronouslyFromConnection:vc
completionHandler:
^(CMSampleBufferRef buf, NSError *err) {
NSData* data = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:buf];
UIImage* im = [UIImage imageWithData:data];
dispatch_async(dispatch_get_main_queue(), ^{
UIImageView* iv = [[UIImageView alloc] initWithFrame:someframe];
iv.contentMode = UIViewContentModeScaleAspectFit;
iv.image = im;
[self.view addSubview: iv];
[self.iv removeFromSuperview]; // in case we already did this
self.iv = iv;
[self.sess stopRunning];
});
}];
Посмотрите на AVCaptureSession о том, как сделать снимок без участия пользователя. Вам нужно будет добавить AVCaptureDevice для камеры в сеанс.
Как говорит @Salil, официальный AVFoundation от Apple очень полезен, взгляните на это, чтобы понять основную концепцию. Затем вы можете скачать пример кода, чтобы увидеть, как достичь цели.
Вот пример кода для съемки неподвижных изображений со слоем предварительного просмотра.