iOS 10 - Objective-C:如何实现 AVCapturePhotoOutput() 来捕获图像和视频

ios

1个回答

写回答

Zz璟

2025-06-21 15:10

+ 关注

IOS
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-c

AVCapturePhotoSettings *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()提供了许多功能和定制选项,以满足我们的需求。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号