#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. Как вы получаете из этого фото предварительного просмотра?