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對象在該方法每次調用時都應該從新創(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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,996評論 25 709
  • 發(fā)現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 15,219評論 4 61
  • 因為要結局swift3.0中引用snapKit的問題,看到一篇介紹Xcode8,swift3變化的文章,覺得很詳細...
    uniapp閱讀 4,861評論 0 12
  • 第三周結構框圖: 注:部分筆記寫在打印出的課件上,如下第三張圖片上的字 11.組合與繼承: 學習類與類之間的關系,...
    hongXkeX閱讀 309評論 0 0
  • 辦公室一個小姑娘失戀了!很傷心,可是我不知道該怎么安慰她。我都30了,孩子都快兩歲了,真的想不起自己當年失戀時是怎...
    曉生寒月閱讀 258評論 0 0

友情鏈接更多精彩內容