1、硬件設備獲取
iOS10以后使用AVCaptureDeviceDiscoverySession獲取手機的相關硬件設備
/*AVCaptureDeviceType
AVCaptureDeviceTypeBuiltInMicrophone 麥克風
AVCaptureDeviceTypeBuiltInWideAngleCamera 內置廣角相機
AVCaptureDeviceTypeBuiltInTelephotoCamera 內置長焦相機
*/
AVCaptureDeviceDiscoverySession *devicesIOS10 = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera] mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionUnspecified];
NSArray *devicesIOS = devicesIOS10.devices;
for (AVCaptureDevice *device in devicesIOS) {
if ([device position] == position) {
return device;
}
}
2、攝像機拍照功能實現
iOS10之后使用AVCapturePhotoOutput實現相機的拍照功能。
AVCaptureDevice *audioCatureDevice = nil;
/*AVCaptureDeviceType
AVCaptureDeviceTypeBuiltInMicrophone 麥克風
AVCaptureDeviceTypeBuiltInWideAngleCamera 內置廣角相機
AVCaptureDeviceTypeBuiltInTelephotoCamera 內置長焦相機
*/
//獲取后置攝像頭
AVCaptureDeviceDiscoverySession *devicesIOS10 = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInMicrophone] mediaType:AVMediaTypeAudio position:AVCaptureDevicePositionUnspecified];
NSArray *devicesIOS = devicesIOS10.devices;
if (devicesIOS.count>0) {
audioCatureDevice = devicesIOS.firstObject;
}
error = nil;
//初始化攝像頭輸入對象
AVCaptureDeviceInput *audioCaptureDeviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:audioCatureDevice error:&error];
if (error) {
HJLog(@"獲取設備輸入對象時出現問題。");
return;
}
//將攝像頭輸入對象加入到aptureSession中
if ([self.captureSession canAddInput:self.captureDeviceInput]) {
[self.captureSession addInput:self.captureDeviceInput];
}
//初始化圖片輸出對象,并加入到aptureSession中
self.captureSession = [[AVCaptureSession alloc] init];
self.captureImageOutputIOS10 = [[AVCapturePhotoOutput alloc] init];
if ([self.captureSession canAddOutput:self.captureImageOutputIOS10]) {
[self.captureSession addOutput:self.captureImageOutputIOS10];
}
//初始化圖像預覽層。
self.captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:self.captureSession];
self.captureVideoPreviewLayer.frame = self.view.bounds;
self.captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
[self.view.layer insertSublayer:self.captureVideoPreviewLayer atIndex:0];
[self.captureSession startRunning];
capturePhotoWithSettings: delegate:方法為獲取相機當前截圖,AVCapturePhotoSettings對象在該方法每次調用時都應該從新創(chuàng)建,否則程序會崩潰。設置代理為當前控制器,并且在當前控制器實現代理方法。
AVCaptureConnection *captureConnection = [self.captureImageOutputIOS10 connectionWithMediaType:AVMediaTypeVideo];
if (!captureConnection) {
HJLog(@"拍照失?。?);
return;
}
//每次需重新創(chuàng)建
AVCapturePhotoSettings *setting = [AVCapturePhotoSettings photoSettings];
//閃光燈狀態(tài)在此處設置
if (self.isFlash) {
setting.flashMode = AVCaptureFlashModeOn;
}else{
setting.flashMode = AVCaptureFlashModeOff;
}
[self.captureImageOutputIOS10 capturePhotoWithSettings:setting delegate:self];
實現代理方法,獲取相機拍攝圖片(iOS 10到iOS 11)
#pragma mark - captureOutput delegate
#ifdef __IPHONE_10_0
- (void)captureOutput:(AVCapturePhotoOutput *)captureOutput didFinishProcessingPhotoSampleBuffer:(nullable CMSampleBufferRef)photoSampleBuffer previewPhotoSampleBuffer:(nullable CMSampleBufferRef)previewPhotoSampleBuffer resolvedSettings:(AVCaptureResolvedPhotoSettings *)resolvedSettings bracketSettings:(nullable AVCaptureBracketedStillImageSettings *)bracketSettings error:(nullable NSError *)error{
NSData *imageData = [AVCapturePhotoOutput JPEGPhotoDataRepresentationForJPEGSampleBuffer:photoSampleBuffer previewPhotoSampleBuffer:previewPhotoSampleBuffer];
self.photoShowView.image = [UIImage imageWithData:imageData];
[self.captureSession stopRunning];
}
#endif
iOS 11以后獲取拍攝圖片方法
#ifdef __IPHONE_11_0
- (void)captureOutput:(AVCapturePhotoOutput *)output didFinishProcessingPhoto:(AVCapturePhoto *)photo error:(nullable NSError *)error{
NSData *imageData = [photo fileDataRepresentation];
[self.captureSession stopRunning];
}
#endif