iOS 10 — Objective-C: как реализовать AVCapturePhotoOutput() для захвата изображений и видео?

#ios #objective-c #iphone #ios10 #avcapturesession

#iOS #objective-c #iPhone #ios10 #avcapturesession

Вопрос:

Я пытаюсь реализовать захват изображений и видео из своего приложения, и теперь, начиная с iOS 10, «AVCaptureStillImageOutput» устарел.

Пожалуйста, помогите мне реализовать AVCapturePhotoOutput в Objective-C.

Вот мой пример кода:

 _avCaptureOutput = [[AVCapturePhotoOutput alloc]init];
_avSettings = [AVCapturePhotoSettings photoSettings];


AVCaptureSession* captureSession = [[AVCaptureSession alloc] init];
[captureSession startRunning];



AVCaptureConnection *connection = [self.movieOutput connectionWithMediaType:AVMediaTypeVideo];

if (connection.active)
{
    //connection is active
    NSLog(@"Connection is active");

    id previewPixelType = _avSettings.availablePreviewPhotoPixelFormatTypes.firstObject;
    NSDictionary *format = @{(NSString*)kCVPixelBufferPixelFormatTypeKey:previewPixelType,(NSString*)kCVPixelBufferWidthKey:@160,(NSString*)kCVPixelBufferHeightKey:@160};

    _avSettings.previewPhotoFormat = format;

    [_avCaptureOutput capturePhotoWithSettings:_avSettings delegate:self];


}
else
{
    NSLog(@"Connection is not active");
    //connection is not active
    //try to change self.captureSession.sessionPreset,
    //or change videoDevice.activeFormat
}
  

Комментарии:

1. какова цель AVCapturePhotoOutput ?

2. вы реализовали AVCapturePhotoCaptureDelegate ?

3. какой тип self.movieOutput ?

4. self.movieOutput — это своего рода класс AVCaptureMovieFileOutput. и да, я реализовал метод AVCapturePhotoCaptureDelegate .

Ответ №1:

 _avCaptureOutput = [[AVCapturePhotoOutput alloc]init];
_avSettings = [AVCapturePhotoSettings photoSettings];

AVCaptureSession* captureSession = [[AVCaptureSession alloc] init];
[captureSession startRunning];

[self.avCaptureOutput capturePhotoWithSettings:self.avSettings delegate:self];
  

self должен реализовать AVCapturePhotoCaptureDelegate

 #pragma mark - AVCapturePhotoCaptureDelegate
-(void)captureOutput:(AVCapturePhotoOutput *)captureOutput didFinishProcessingPhotoSampleBuffer:(CMSampleBufferRef)photoSampleBuffer previewPhotoSampleBuffer:(CMSampleBufferRef)previewPhotoSampleBuffer resolvedSettings:(AVCaptureResolvedPhotoSettings *)resolvedSettings bracketSettings:(AVCaptureBracketedStillImageSettings *)bracketSettings error:(NSError *)error
{
    if (error) {
        NSLog(@"error : %@", error.localizedDescription);
    }

    if (photoSampleBuffer) {
        NSData *data = [AVCapturePhotoOutput JPEGPhotoDataRepresentationForJPEGSampleBuffer:photoSampleBuffer previewPhotoSampleBuffer:previewPhotoSampleBuffer];
        UIImage *image = [UIImage imageWithData:data];
    }
}
  

Теперь вы получаете изображение и делаете все, что хотите.


Примечание: поскольку iOS 11 -captureOutput:didFinishProcessingPhotoSampleBuffer:... устарела, необходимо использовать -captureOutput:didFinishProcessingPhoto:error: вместо:

 - (void)captureOutput:(AVCapturePhotoOutput *)output didFinishProcessingPhoto:(AVCapturePhoto *)photo error:(nullable NSError *)error
{  
  NSData *imageData = [photo fileDataRepresentation];
  UIImage *image = [UIImage imageWithData:data];
  ...
}
  

Комментарии:

1. Действительно простая реализация

2. Как вы получаете из этого фото предварительного просмотра?