iOS10、11 AVFoundation的一些改动

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对象在该方法每次调用时都应该从新创建,否则程序会崩溃。设置代理为当前控制器,并且在当前控制器实现代理方法。

 AVCaptureConnection *captureConnection = [self.captureImageOutputIOS10 connectionWithMediaType:AVMediaTypeVideo];
if (!captureConnection) {
      HJLog(@"拍照失败!");
      return;
}
//每次需重新创建
AVCapturePhotoSettings *setting = [AVCapturePhotoSettings photoSettings];
//闪光灯状态在此处设置
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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,179评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,196评论 4 61
  • 因为要结局swift3.0中引用snapKit的问题,看到一篇介绍Xcode8,swift3变化的文章,觉得很详细...
    uniapp阅读 10,034评论 0 12
  • 第三周结构框图: 注:部分笔记写在打印出的课件上,如下第三张图片上的字 11.组合与继承: 学习类与类之间的关系,...
    hongXkeX阅读 1,872评论 0 0
  • 办公室一个小姑娘失恋了!很伤心,可是我不知道该怎么安慰她。我都30了,孩子都快两岁了,真的想不起自己当年失恋时是怎...
    晓生寒月阅读 1,592评论 0 0