使用AVCaptureSession进行图像和视频捕获
立即解锁
发布时间: 2025-08-25 01:37:25 阅读量: 3 订阅数: 20 


iOS 7开发实战:从入门到精通
### 使用AVCaptureSession进行图像和视频捕获
在开发涉及相机功能的应用时,AVCaptureSession是一个强大的工具,它可以帮助我们实现图像和视频的捕获。下面将详细介绍如何使用AVCaptureSession进行静态图像和视频的捕获。
#### 1. 捕获静态图像
在捕获静态图像之前,我们需要对项目进行一些必要的更改。
- **添加AssetsLibrary.framework**:将AssetsLibrary.framework添加到项目中,该框架用于将照片写入照片库。
- **添加权限描述**:由于需要访问设备的共享照片库,因此需要在应用的Info.plist文件中添加NSPhotoLibraryUsageDescription键,并简要说明应用请求访问的原因,例如“Testing AVCaptureSession”。
##### 1.1 添加捕获按钮
为了触发静态图像的捕获,我们需要在视图控制器的故事板视图中添加一个标题为“Capture”的按钮,并为该按钮创建一个名为“capture”的动作。同时,为确保按钮能随屏幕大小调整位置,选择按钮并从故事板编辑器屏幕右下角的“Resolve Auto Layout Issues”菜单中选择“Add Missing Constraints”。
##### 1.2 修改ViewController.h文件
在ViewController.h文件中导入AssetsLibrary框架,并添加一个属性来保存静态图像输出实例。以下是修改后的代码:
```objc
//
// ViewController.h
// Recipe 9-6: Taking Still Images With AVCaptureSession
//
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <AssetsLibrary/AssetsLibrary.h>
@interface ViewController : UIViewController
@property (strong, nonatomic) AVCaptureSession *captureSession;
@property (strong, nonatomic) AVCaptureDeviceInput *videoInput;
@property (strong, nonatomic) AVCaptureStillImageOutput *stillImageOutput;
- (IBAction)capture:(id)sender;
@end
```
##### 1.3 修改ViewController.m文件
在ViewController.m文件的viewDidLoad方法中添加代码,用于分配和初始化静态图像输出对象,并将其连接到捕获会话。以下是修改后的代码:
```objc
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.captureSession = [[AVCaptureSession alloc] init];
//Optional: self.captureSession.sessionPreset = AVCaptureSessionPresetMedium;
AVCaptureDevice *device =
[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error = nil;
self.videoInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
if (self.videoInput)
{
[self.captureSession addInput:self.videoInput];
}
else
{
NSLog(@"Input Error: %@", error);
}
self.stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
NSDictionary *stillImageOutputSettings =
[[NSDictionary alloc] initWithObjectsAndKeys:
AVVideoCodecJPEG, AVVideoCodecKey, nil];
[self.stillImageOutput setOutputSettings:stillImageOutputSettings];
[self.captureSession addOutput:self.stillImageOutput];
AVCaptureVideoPreviewLayer *previewLayer =
[AVCaptureVideoPreviewLayer layerWithSession:self.captureSession];
UIView *aView = self.view;
previewLayer.frame =
CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height-70);
[aView.layer addSublayer:previewLayer];
}
```
##### 1.4 实现捕获动作方法
在捕获动作方法中,我们调用一个辅助方法来触发静态图像的捕获。以下是实现代码:
```objc
- (IBAction)capture:(id)sender
{
[self captureStillImage];
}
```
##### 1.5 实现captureStillImage方法
该方法的实现步骤如下:
1. 获取捕获连接,并确保使用纵向方向捕获图像。
2. 异步捕获静态图像,并在捕获完成后执行相应的操作。
3. 检查捕获是否成功,如果成功则从缓冲区提取图像。
4. 将图像保存到照片库,并在保存完成后显示提示信息。
以下是完整的captureStillImage方法实现:
```objc
- (void) captureStillImage
{
AVCaptureConnection *stillImageConnection =
[self.stillImageOutput.connections objectAtIndex:0];
if ([stillImageConnection isVideoOrientationSupported])
[stillImageConnection setVideoOrientation:AVCaptureVideoOrientationPortrait];
[self.stillImageOutput
captureStillImageAsynchronouslyFromConnection:stillImageConnection
completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error)
{
if (imageDataSampleBuffer != NULL)
{
NSData *imageData = [AVCaptureStillImageOutput
jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
UIImage *image = [[UIImage alloc] initWithData:imageData];
[library writeImageToSavedPhotosAlbum:[image CGImage]
orientation:(ALAssetOrientation)[image imageOrientation]
completionBlock:^(NSURL *assetURL, NSError *error)
{
UIAlertView *alert;
if (!error)
{
alert = [[UIAlertView alloc] initWithTitle:@"Photo Saved"
message:@"The photo was successfully saved to your photos library"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
}
else
{
alert = [[UIAlertView alloc] initWithTitle:@"Error Saving Photo"
message:@"The photo was not saved to your photos library"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
}
[alert show];
}
];
}
else
{
NSLog(@"Error capturing still image: %@", error);
}
}
];
}
```
#### 2. 捕获视频
在实现了静态图像捕获的基础上,我们可以进一步扩展应用,使其支持视频录制功能。
##### 2.1 添加视频录制模式
在用户界面中添加一个分段控件,让用户可以在静态图像和视频录制模式之间切换。将分段控件的两个分段默认文本分别改为“Take Photo”和“Record Video”。
##### 2.2 添加出口和动作
为分段控件和按钮添加出口,分别命名为“modeControl”和“captureButton”。同时,为分段控件的值更改事件创建一个名为“updateMode”的动作。
##### 2.3 修改ViewController.h文件
在ViewController.h文件中添加一些用于视频录制设置的属性,并添加AVCaptureFileOutputRecordingDelegate协议。以下是修改后的代码:
```objc
//
// ViewController.h
// Recipe 9-7 Recording Video With AVCaptureSession
//
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <AssetsLibrary/AssetsLibrary.h>
@interface ViewController : UIViewController <AVCaptureFileOutputRecordingDelegate>
@property (strong, nonatomic) AVCaptureSession *captureSession;
@property (strong, nonatomic) AVCaptureDeviceInput *videoInput;
@property (strong, nonatomic) AVCaptureDeviceInput *audioInput;
@property (strong, nonatomic) AVCaptureStillImageOutput *stillImageOutput;
@property (strong, nonatomic) AVCaptureMovieFileOutput *movieOutput;
@property (weak, nonatomic) IBOutlet UIButton *captureButton;
@property (weak, nonatomic) IBOutlet UISegmentedControl *modeControl;
- (IBAction)capture:(id)sender;
- (IBAction)updateMode:(id)sender;
@end
```
##### 2.4 修改ViewController.m文件
在ViewController.m文件的viewDidLoad方法中进行一些更改,包括设置音频输入对象、添加错误检查、设置电影输出对象等。以下是修改后的完整viewDidLoad方法:
```objc
- (void)viewDidLoad
{
[super viewDidLoad];
self.captureSession = [[AVCaptureSession alloc] init];
//Optional: self.captureSession.sessionPreset = AVCaptureSessionPresetMedium;
AVCaptureDevice *videoDevice =
[AVCaptureDevice
```
0
0
复制全文
相关推荐










