
IOS
如何使用AVCapturePhotoOutput()在IOS 10中捕获图像和视频
在IOS 10中,我们可以使用AVCapturePhotoOutput()来实现图像和视频的捕获。AVCapturePhotoOutput()是一个用于拍摄照片和视频的核心类。它提供了许多功能,如控制曝光、焦距和闪光灯等。首先,我们需要在项目中导入AVFoundation框架。然后,我们可以创建一个AVCaptureSession对象,并设置其预设值为AVCaptureSessionPresetPhoto,以便使用AVCapturePhotoOutput()进行图像捕获。下面是一个捕获图像的示例代码:objective-c#import <AVFoundation/AVFoundation.h>...- (void)captureImage { AVCaptureSession *session = [[AVCaptureSession alloc] init]; session.sessionPreset = AVCaptureSessionPresetPhoto; AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVIDEO]; NSError *error; AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; if (!input) { NSLog(@"无法创建输入设备:%@", error.localizedDescription); return; } if ([session canAddInput:input]) { [session addInput:input]; } AVCapturePhotoOutput *output = [[AVCapturePhotoOutput alloc] init]; if ([session canAddOutput:output]) { [session addOutput:output]; } AVCaptureVIDEOPreviewLayer *previewLayer = [AVCaptureVIDEOPreviewLayer layerWithSession:session]; previewLayer.vIDEOGravity = AVLayerVIDEOGravityResizeAspectFill; previewLayer.frame = self.view.bounds; [self.view.layer addSublayer:previewLayer]; [session startRunning]; AVCapturePhotoSettings *settings = [[AVCapturePhotoSettings alloc] init]; [output capturePhotoWithSettings:settings delegate:self];}...#pragma mark - AVCapturePhotoCaptureDelegate- (void)captureOutput:(AVCapturePhotoOutput *)output didFinishProcessingPhoto:(AVCapturePhoto *)photo error:(NSError *)error { if (error) { NSLog(@"捕获照片时发生错误:%@", error.localizedDescription); return; } NSData *imageData = photo.fileDataRepresentation; UIImage *image = [UIImage imageWithData:imageData]; // 在这里可以处理捕获到的图像}在上面的示例代码中,我们首先创建了一个AVCaptureSession对象,并将其预设值设置为AVCaptureSessionPresetPhoto。然后,我们使用AVCaptureDevice的defaultDeviceWithMediaType:方法获取默认的视频设备。接下来,我们创建一个AVCaptureDeviceInput对象,并将其添加到AVCaptureSession中。然后,我们创建了一个AVCapturePhotoOutput对象,并将其添加到AVCaptureSession中。为了预览捕获到的图像,我们使用AVCaptureVIDEOPreviewLayer创建了一个预览层,并将其添加到视图的图层中。最后,我们通过调用capturePhotoWithSettings:delegate:方法来捕获图像。在AVCapturePhotoCaptureDelegate的代理方法中,我们可以处理捕获到的图像数据。在这个例子中,我们将图像数据转换为UIImage,并可以在此进行后续处理。自定义捕获设置除了默认的捕获设置外,我们还可以自定义捕获设置,以便更好地控制拍摄过程。例如,我们可以设置曝光、闪光灯、焦距等参数。下面是一个自定义捕获设置的示例代码:objective-cAVCapturePhotoSettings *settings = [[AVCapturePhotoSettings alloc] init];settings.flashMode = AVCaptureFlashModeAuto;settings.autoStillImageStabilizationEnabled = YES;settings.highResolutionPhotoEnabled = YES;[output capturePhotoWithSettings:settings delegate:self];在上面的示例代码中,我们创建了一个AVCapturePhotoSettings对象,并设置了闪光灯模式为自动,启用了自动静态图像稳定和高分辨率拍摄。捕获视频除了捕获图像外,AVCapturePhotoOutput()还可以用于捕获视频。我们可以通过设置AVCaptureSession的预设值为AVCaptureSessionPresetHigh,来使用AVCapturePhotoOutput()进行视频捕获。下面是一个捕获视频的示例代码:
objective-c...- (void)captureVIDEO { AVCaptureSession *session = [[AVCaptureSession alloc] init]; session.sessionPreset = AVCaptureSessionPresetHigh; AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVIDEO]; NSError *error; AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; if (!input) { NSLog(@"无法创建输入设备:%@", error.localizedDescription); return; } if ([session canAddInput:input]) { [session addInput:input]; } AVCaptureMovieFileOutput *output = [[AVCaptureMovieFileOutput alloc] init]; if ([session canAddOutput:output]) { [session addOutput:output]; } AVCaptureVIDEOPreviewLayer *previewLayer = [AVCaptureVIDEOPreviewLayer layerWithSession:session]; previewLayer.vIDEOGravity = AVLayerVIDEOGravityResizeAspectFill; previewLayer.frame = self.view.bounds; [self.view.layer addSublayer:previewLayer]; [session startRunning]; NSString *outputPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"output.mov"]; NSURL *outputURL = [NSURL fileURLWithPath:outputPath]; [output startRecordingToOutputFileURL:outputURL recordingDelegate:self];}...#pragma mark - AVCaptureFileOutputRecordingDelegate- (void)captureOutput:(AVCaptureFileOutput *)output didStartRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray<AVCaptureConnection *> *)connections { // 开始录制视频时的处理}- (void)captureOutput:(AVCaptureFileOutput *)output didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray<AVCaptureConnection *> *)connections error:(NSError *)error { if (error) { NSLog(@"录制视频时发生错误:%@", error.localizedDescription); return; } // 完成录制视频后的处理}在上面的示例代码中,我们首先创建了一个AVCaptureSession对象,并将其预设值设置为AVCaptureSessionPresetHigh。然后,我们使用AVCaptureDevice的defaultDeviceWithMediaType:方法获取默认的视频设备,并创建一个AVCaptureDeviceInput对象。接下来,我们创建了一个AVCaptureMovieFileOutput对象,并将其添加到AVCaptureSession中。为了预览捕获到的视频,我们使用AVCaptureVIDEOPreviewLayer创建了一个预览层,并将其添加到视图的图层中。最后,我们通过调用startRecordingToOutputFileURL:recordingDelegate:方法来开始录制视频。在AVCaptureFileOutputRecordingDelegate的代理方法中,我们可以处理录制开始和结束时的操作。在此示例中,我们只是简单地打印出了开始和结束录制的日志。通过使用AVCapturePhotoOutput(),我们可以轻松地在IOS 10中进行图像和视频的捕获。无论是拍摄照片还是录制视频,AVCapturePhotoOutput()提供了许多功能和定制选项,以满足我们的需求。Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号