亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS AVCaptureSession實現視頻錄制功能

2020-07-26 02:28:13
字體:
來源:轉載
供稿:網友

本文實例為大家分享了AVCaptureSession實現視頻錄制功能的具體代碼,供大家參考,具體內容如下

#import "RecordingVideoViewController.h" #import <AVFoundation/AVFoundation.h> #import <AssetsLibrary/AssetsLibrary.h>  @interface RecordingVideoViewController ()<AVCaptureFileOutputRecordingDelegate>  //會話 負責輸入和輸出設備之間的數據傳遞 @property (strong,nonatomic) AVCaptureSession  *captureSession; //設備輸入 負責從AVCaptureDevice獲得輸入數據 @property (strong,nonatomic) AVCaptureDeviceInput  *videoCaptureDeviceInput; @property (strong,nonatomic) AVCaptureDeviceInput  *audioCaptureDeviceInput; //視頻輸出流 @property (strong,nonatomic) AVCaptureMovieFileOutput  *captureMovieFileOutput; //相機拍攝預覽圖層 @property (strong,nonatomic) AVCaptureVideoPreviewLayer  *captureVideoPreviewLayer;  //自定義UI控件容器 @property (strong,nonatomic) UIView  *viewContainer; //聚焦圖標 @property (strong,nonatomic) UIImageView  *focusCursor; //錄制時長 @property (strong,nonatomic) UILabel  *timeLabel; //切換前后攝像頭 @property (strong,nonatomic) UIButton  *switchCameraBtn; //改變焦距 @property (strong,nonatomic) UIButton  *scaleBtn; //計時器 @property (strong,nonatomic) NSTimer  *timer;   @end  @implementation RecordingVideoViewController {  @private   NSInteger _num;   CGFloat _kCameraScale; }   - (UIView *)viewContainer {   if (!_viewContainer) {     _viewContainer = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];          UIButton *takeButton = [UIButton buttonWithType:UIButtonTypeCustom];     takeButton.backgroundColor = [UIColor redColor];     [takeButton setTitle:@"start" forState:UIControlStateNormal];     [takeButton addTarget:self action:@selector(takeButtonClick:) forControlEvents:UIControlEventTouchUpInside];             _timeLabel = [[UILabel alloc] init];     _timeLabel.textColor = [UIColor redColor];     _timeLabel.textAlignment = NSTextAlignmentCenter;     _timeLabel.font = [UIFont boldSystemFontOfSize:20];     _timeLabel.text = @"00:00";               _switchCameraBtn = [UIButton buttonWithType:UIButtonTypeCustom];     [_switchCameraBtn setTitle:@"switch" forState:UIControlStateNormal];     _switchCameraBtn.backgroundColor = [UIColor redColor];     [_switchCameraBtn addTarget:self action:@selector(switchCameraBtnClick) forControlEvents:UIControlEventTouchUpInside];          _scaleBtn = [UIButton buttonWithType:UIButtonTypeCustom];     [_scaleBtn setTitle:@"1X" forState:UIControlStateNormal];     _scaleBtn.backgroundColor = [UIColor redColor];     [_scaleBtn addTarget:self action:@selector(scaleBtnClick:) forControlEvents:UIControlEventTouchUpInside];          [_viewContainer addSubview:takeButton];     [_viewContainer addSubview:_timeLabel];     [_viewContainer addSubview:_scaleBtn];     [_viewContainer addSubview:_switchCameraBtn];     [takeButton mas_makeConstraints:^(MASConstraintMaker *make) {       make.size.mas_equalTo(CGSizeMake(60, 40));       make.centerX.mas_equalTo(_viewContainer);       make.bottom.mas_equalTo(_viewContainer).offset(-64);     }];     [_timeLabel mas_makeConstraints:^(MASConstraintMaker *make) {       make.centerX.mas_equalTo(_viewContainer);       make.height.mas_equalTo(@30);       make.top.mas_equalTo(_viewContainer);     }];     [_scaleBtn mas_makeConstraints:^(MASConstraintMaker *make) {       make.size.mas_equalTo(CGSizeMake(60, 40));       make.left.mas_equalTo(_viewContainer).offset(10);       make.top.mas_equalTo(_viewContainer);     }];     [_switchCameraBtn mas_makeConstraints:^(MASConstraintMaker *make) {       make.size.mas_equalTo(CGSizeMake(60, 40));       make.top.mas_equalTo(_viewContainer);       make.right.mas_equalTo(_viewContainer).offset(-10);     }];          _focusCursor = [[UIImageView alloc] init];     kBorder(_focusCursor, 1, [UIColor yellowColor]);     _focusCursor.alpha = 0;     [_viewContainer addSubview:self.focusCursor];     [_focusCursor mas_makeConstraints:^(MASConstraintMaker *make) {       make.size.mas_equalTo(CGSizeMake(40, 40));       make.center.mas_equalTo(_viewContainer);     }];    }   return _viewContainer; }  - (void)viewDidLoad {   [super viewDidLoad];      self.title = @"視頻錄制";   _kCameraScale = 1.0f;   //初始化會話對象   _captureSession = [[AVCaptureSession alloc] init];   if ([_captureSession canSetSessionPreset:AVCaptureSessionPreset1280x720]) {     _captureSession.sessionPreset = AVCaptureSessionPreset1280x720;   }         NSError *error = nil;    //獲取視頻輸入對象   AVCaptureDevice *videoCaptureDevice = [self cameraDeviceWithPosition:(AVCaptureDevicePositionBack)];   if (!videoCaptureDevice) {     NSLog(@"獲取后置攝像頭失?。?);     return;   }   _videoCaptureDeviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:videoCaptureDevice error:&error];   if (error) {     NSLog(@"取得視頻設備輸入對象時出錯");     return;   }         //獲取音頻輸入對象   AVCaptureDevice *audioCatureDevice = [[AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio] firstObject];   _audioCaptureDeviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:audioCatureDevice error:&error];   if (error) {     NSLog(@"取得音頻設備輸入對象時出錯");     return;   }      //初始化設備輸出對象   _captureMovieFileOutput = [[AVCaptureMovieFileOutput alloc] init];      //將設備輸入添加到會話中   if ([_captureSession canAddInput:_videoCaptureDeviceInput]) {     [_captureSession addInput:_videoCaptureDeviceInput];     [_captureSession addInput:_audioCaptureDeviceInput];          //防抖功能     AVCaptureConnection *captureConnection = [_captureMovieFileOutput connectionWithMediaType:AVMediaTypeAudio];     if ([captureConnection isVideoStabilizationSupported]) {       captureConnection.preferredVideoStabilizationMode = AVCaptureVideoStabilizationModeAuto;     }   }      //將設備輸出添加到會話中   if ([_captureSession canAddOutput:_captureMovieFileOutput]) {     [_captureSession addOutput:_captureMovieFileOutput];   }         //創建視頻預覽圖層   _captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];   self.viewContainer.layer.masksToBounds = YES;   _captureVideoPreviewLayer.frame = self.viewContainer.bounds;   _captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;   [self.view.layer addSublayer:_captureVideoPreviewLayer];      //顯示自定義控件   [self.view addSubview:self.viewContainer];      //添加點按聚焦手勢   UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapScreen:)];   [self.viewContainer addGestureRecognizer:tapGesture];    }  -(void)viewDidAppear:(BOOL)animated{   [super viewDidAppear:animated];   [self.captureSession startRunning]; }  -(void)viewDidDisappear:(BOOL)animated{   [super viewDidDisappear:animated];   [self.captureSession stopRunning];   [self.timer invalidate];   self.timer = nil; }  - (void)viewWillDisappear:(BOOL)animated {   [super viewWillDisappear:animated];   [self.captureVideoPreviewLayer setAffineTransform:CGAffineTransformMakeScale(1, 1)]; }  - (void)didReceiveMemoryWarning {   [super didReceiveMemoryWarning]; }  //開始 + 暫停錄制 - (void)takeButtonClick:(UIButton *)sender {   if ([self.captureMovieFileOutput isRecording]) {     [self.captureMovieFileOutput stopRecording];          [self.navigationController popViewControllerAnimated:YES];        } else {     AVCaptureConnection *captureConnection = [self.captureMovieFileOutput connectionWithMediaType:AVMediaTypeVideo];     captureConnection.videoOrientation = [self.captureVideoPreviewLayer connection].videoOrientation;          NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"Movie.mov"];     NSLog(@"%@",filePath);     [self.captureMovieFileOutput startRecordingToOutputFileURL:[NSURL fileURLWithPath:filePath] recordingDelegate:self];               self.switchCameraBtn.hidden = YES;          sender.backgroundColor = [UIColor greenColor];     [sender setTitle:@"stop" forState:UIControlStateNormal];          self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeAction) userInfo:nil repeats:YES];     [self.timer setFireDate:[NSDate distantPast]];   } }  //切換攝像頭 - (void)switchCameraBtnClick {   AVCaptureDevicePosition currentPosition = self.videoCaptureDeviceInput.device.position;   AVCaptureDevicePosition toPosition;   if (currentPosition == AVCaptureDevicePositionUnspecified ||     currentPosition == AVCaptureDevicePositionFront) {     toPosition = AVCaptureDevicePositionBack;   } else {     toPosition = AVCaptureDevicePositionFront;   }      AVCaptureDevice *toCapturDevice = [self cameraDeviceWithPosition:toPosition];   if (!toCapturDevice) {     NSLog(@"獲取要切換的設備失敗");     return;   }      NSError *error = nil;   AVCaptureDeviceInput *toVideoDeviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:toCapturDevice error:&error];   if (error) {     NSLog(@"獲取要切換的設備輸入失敗");     return;   }      //改變會話配置   [self.captureSession beginConfiguration];      [self.captureSession removeInput:self.videoCaptureDeviceInput];   if ([self.captureSession canAddInput:toVideoDeviceInput]) {     [self.captureSession addInput:toVideoDeviceInput];          self.videoCaptureDeviceInput = toVideoDeviceInput;   }   //提交會話配置   [self.captureSession commitConfiguration]; }   //點按手勢 - (void)tapScreen:(UITapGestureRecognizer *)tap {   CGPoint point = [tap locationInView:self.viewContainer];      //將界面point對應到攝像頭point   CGPoint cameraPoint = [self.captureVideoPreviewLayer captureDevicePointOfInterestForPoint:point];    //設置聚光動畫   self.focusCursor.center = point;   self.focusCursor.transform = CGAffineTransformMakeScale(1.5, 1.5);   self.focusCursor.alpha = 1.0f;   [UIView animateWithDuration:1 animations:^{     self.focusCursor.transform = CGAffineTransformIdentity;   } completion:^(BOOL finished) {     self.focusCursor.alpha = 0.0f;    }];      //設置聚光點坐標   [self focusWithMode:AVCaptureFocusModeAutoFocus exposureMode:AVCaptureExposureModeAutoExpose atPoint:cameraPoint];  }   /**設置聚焦點*/ -(void)focusWithMode:(AVCaptureFocusMode)focusMode exposureMode:(AVCaptureExposureMode)exposureMode atPoint:(CGPoint)point{      AVCaptureDevice *captureDevice= [self.videoCaptureDeviceInput device];   NSError *error = nil;   //設置設備屬性必須先解鎖 然后加鎖   if ([captureDevice lockForConfiguration:&error]) {          if ([captureDevice isFocusModeSupported:focusMode]) {       [captureDevice setFocusMode:focusMode];     }     if ([captureDevice isFocusPointOfInterestSupported]) {       [captureDevice setFocusPointOfInterest:point];     }     //    //曝光     //    if ([captureDevice isExposureModeSupported:exposureMode]) {     //      [captureDevice setExposureMode:exposureMode];     //    }     //    if ([captureDevice isExposurePointOfInterestSupported]) {     //      [captureDevice setExposurePointOfInterest:point];     //    }     //    //閃光燈模式     //    if ([captureDevice isFlashModeSupported:AVCaptureFlashModeAuto]) {     //      [captureDevice setFlashMode:AVCaptureFlashModeAuto];     //    }          //加鎖     [captureDevice unlockForConfiguration];        }else{     NSLog(@"設置設備屬性過程發生錯誤,錯誤信息:%@",error.localizedDescription);   } }    //調整焦距 -(void)scaleBtnClick:(UIButton *)sender {   _kCameraScale += 0.5;   if(_kCameraScale > 3.0) {     _kCameraScale = 1.0;   }   //改變焦距   AVCaptureDevice *videoDevice = self.videoCaptureDeviceInput.device;   NSError *error = nil;   if ([videoDevice lockForConfiguration:&error]) {          [videoDevice setVideoZoomFactor:_kCameraScale];          [videoDevice unlockForConfiguration];          [sender setTitle:[NSString stringWithFormat:@"%lgX",_kCameraScale] forState:UIControlStateNormal];      [CATransaction begin];     [CATransaction setAnimationDuration:0.25];     [self.captureVideoPreviewLayer setAffineTransform:CGAffineTransformMakeScale(_kCameraScale, _kCameraScale)];     [CATransaction commit];        } else {     NSLog(@"修改設備屬性失敗!")   } }    #pragma mark -------- AVCaptureFileOutputRecordingDelegate ---------- - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didStartRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections {   NSLog(@"開始錄制"); }  - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error {   NSLog(@"錄制結束");   ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];   [assetsLibrary writeVideoAtPathToSavedPhotosAlbum:outputFileURL completionBlock:^(NSURL *assetURL, NSError *error) {     if (error) {       NSLog(@"保存視頻到相簿過程中發生錯誤,錯誤信息:%@",error.localizedDescription);     }   }]; }  //錄制計時 - (void)timeAction {   self.timeLabel.text = [NSString stringWithFormat:@"%.2ld:%.2ld",_num/60,_num%60];   _num ++; }   /**取得指定位置的攝像頭*/ - (AVCaptureDevice *)cameraDeviceWithPosition:(AVCaptureDevicePosition )position{   NSArray *cameras = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];   for (AVCaptureDevice *camera in cameras) {     if ([camera position] == position) {       return camera;     }   }   return nil; }   @end 

參考代碼:

#import "VideoTestViewController.h" #import <AVFoundation/AVFoundation.h> #import <AssetsLibrary/AssetsLibrary.h>  typedef void(^PropertyChangeBlock)(AVCaptureDevice *captureDevice);  @interface VideoTestViewController ()<AVCaptureFileOutputRecordingDelegate>//視頻文件輸出代理  @property (strong,nonatomic) AVCaptureSession *captureSession;//負責輸入和輸出設備之間的數據傳遞 @property (strong,nonatomic) AVCaptureDeviceInput *captureDeviceInput;//負責從AVCaptureDevice獲得輸入數據 @property (strong,nonatomic) AVCaptureMovieFileOutput *captureMovieFileOutput;//視頻輸出流 @property (strong,nonatomic) AVCaptureVideoPreviewLayer *captureVideoPreviewLayer;//相機拍攝預覽圖層  @property (assign,nonatomic) BOOL enableRotation;//是否允許旋轉(注意在視頻錄制過程中禁止屏幕旋轉) @property (assign,nonatomic) CGRect *lastBounds;//旋轉的前大小 @property (assign,nonatomic) UIBackgroundTaskIdentifier backgroundTaskIdentifier;//后臺任務標識 @property (strong,nonatomic) UIView *viewContainer; @property (strong,nonatomic) UIButton *takeButton;//拍照按鈕 @property (strong,nonatomic) UIImageView *focusCursor; //聚焦光標   @end  @implementation VideoTestViewController  #pragma mark - 控制器視圖方法 - (void)viewDidLoad {   [super viewDidLoad]; }  -(void)viewWillAppear:(BOOL)animated{   [super viewWillAppear:animated];      //初始化會話   _captureSession=[[AVCaptureSession alloc]init];   if ([_captureSession canSetSessionPreset:AVCaptureSessionPreset1280x720]) {//設置分辨率     _captureSession.sessionPreset=AVCaptureSessionPreset1280x720;   }   //獲得輸入設備   AVCaptureDevice *captureDevice=[self getCameraDeviceWithPosition:AVCaptureDevicePositionBack];//取得后置攝像頭   if (!captureDevice) {     NSLog(@"取得后置攝像頭時出現問題.");     return;   }   //添加一個音頻輸入設備   AVCaptureDevice *audioCaptureDevice=[[AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio] firstObject];         NSError *error=nil;   //根據輸入設備初始化設備輸入對象,用于獲得輸入數據   _captureDeviceInput=[[AVCaptureDeviceInput alloc]initWithDevice:captureDevice error:&error];   if (error) {     NSLog(@"取得設備輸入對象時出錯,錯誤原因:%@",error.localizedDescription);     return;   }   AVCaptureDeviceInput *audioCaptureDeviceInput=[[AVCaptureDeviceInput alloc]initWithDevice:audioCaptureDevice error:&error];   if (error) {     NSLog(@"取得設備輸入對象時出錯,錯誤原因:%@",error.localizedDescription);     return;   }   //初始化設備輸出對象,用于獲得輸出數據   _captureMovieFileOutput=[[AVCaptureMovieFileOutput alloc]init];      //將設備輸入添加到會話中   if ([_captureSession canAddInput:_captureDeviceInput]) {     [_captureSession addInput:_captureDeviceInput];     [_captureSession addInput:audioCaptureDeviceInput];     AVCaptureConnection *captureConnection=[_captureMovieFileOutput connectionWithMediaType:AVMediaTypeVideo];     if ([captureConnection isVideoStabilizationSupported ]) {       captureConnection.preferredVideoStabilizationMode=AVCaptureVideoStabilizationModeAuto;     }   }      //將設備輸出添加到會話中   if ([_captureSession canAddOutput:_captureMovieFileOutput]) {     [_captureSession addOutput:_captureMovieFileOutput];   }      //創建視頻預覽層,用于實時展示攝像頭狀態   _captureVideoPreviewLayer=[[AVCaptureVideoPreviewLayer alloc]initWithSession:self.captureSession];      CALayer *layer=self.viewContainer.layer;   layer.masksToBounds=YES;      _captureVideoPreviewLayer.frame=layer.bounds;   _captureVideoPreviewLayer.videoGravity=AVLayerVideoGravityResizeAspectFill;//填充模式   //將視頻預覽層添加到界面中   //[layer addSublayer:_captureVideoPreviewLayer];   [layer insertSublayer:_captureVideoPreviewLayer below:self.focusCursor.layer];      _enableRotation=YES;   [self addNotificationToCaptureDevice:captureDevice];   [self addGenstureRecognizer]; }  -(void)viewDidAppear:(BOOL)animated{   [super viewDidAppear:animated];   [self.captureSession startRunning]; }  -(void)viewDidDisappear:(BOOL)animated{   [super viewDidDisappear:animated];   [self.captureSession stopRunning]; }  - (void)didReceiveMemoryWarning {   [super didReceiveMemoryWarning]; }  -(BOOL)shouldAutorotate{   return self.enableRotation; }  ////屏幕旋轉時調整視頻預覽圖層的方向 //-(void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{ //  [super willTransitionToTraitCollection:newCollection withTransitionCoordinator:coordinator]; ////  NSLog(@"%i,%i",newCollection.verticalSizeClass,newCollection.horizontalSizeClass); //  UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; //  NSLog(@"%i",orientation); //  AVCaptureConnection *captureConnection=[self.captureVideoPreviewLayer connection]; //  captureConnection.videoOrientation=orientation; // //} //屏幕旋轉時調整視頻預覽圖層的方向 -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{   AVCaptureConnection *captureConnection=[self.captureVideoPreviewLayer connection];   captureConnection.videoOrientation=(AVCaptureVideoOrientation)toInterfaceOrientation; } //旋轉后重新設置大小 -(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{   _captureVideoPreviewLayer.frame=self.viewContainer.bounds; }  -(void)dealloc{   [self removeNotification]; } #pragma mark - UI方法 #pragma mark 視頻錄制 - (void)takeButtonClick:(UIButton *)sender {   //根據設備輸出獲得連接   AVCaptureConnection *captureConnection=[self.captureMovieFileOutput connectionWithMediaType:AVMediaTypeVideo];   //根據連接取得設備輸出的數據   if (![self.captureMovieFileOutput isRecording]) {     self.enableRotation=NO;     //如果支持多任務則則開始多任務     if ([[UIDevice currentDevice] isMultitaskingSupported]) {       self.backgroundTaskIdentifier=[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];     }     //預覽圖層和視頻方向保持一致     captureConnection.videoOrientation=[self.captureVideoPreviewLayer connection].videoOrientation;     NSString *outputFielPath=[NSTemporaryDirectory() stringByAppendingString:@"myMovie.mov"];     NSLog(@"save path is :%@",outputFielPath);     NSURL *fileUrl=[NSURL fileURLWithPath:outputFielPath];     [self.captureMovieFileOutput startRecordingToOutputFileURL:fileUrl recordingDelegate:self];   }   else{     [self.captureMovieFileOutput stopRecording];//停止錄制   } } #pragma mark 切換前后攝像頭 - (void)toggleButtonClick:(UIButton *)sender {   AVCaptureDevice *currentDevice=[self.captureDeviceInput device];   AVCaptureDevicePosition currentPosition=[currentDevice position];   [self removeNotificationFromCaptureDevice:currentDevice];   AVCaptureDevice *toChangeDevice;   AVCaptureDevicePosition toChangePosition=AVCaptureDevicePositionFront;   if (currentPosition==AVCaptureDevicePositionUnspecified||currentPosition==AVCaptureDevicePositionFront) {     toChangePosition=AVCaptureDevicePositionBack;   }   toChangeDevice=[self getCameraDeviceWithPosition:toChangePosition];   [self addNotificationToCaptureDevice:toChangeDevice];   //獲得要調整的設備輸入對象   AVCaptureDeviceInput *toChangeDeviceInput=[[AVCaptureDeviceInput alloc]initWithDevice:toChangeDevice error:nil];      //改變會話的配置前一定要先開啟配置,配置完成后提交配置改變   [self.captureSession beginConfiguration];   //移除原有輸入對象   [self.captureSession removeInput:self.captureDeviceInput];   //添加新的輸入對象   if ([self.captureSession canAddInput:toChangeDeviceInput]) {     [self.captureSession addInput:toChangeDeviceInput];     self.captureDeviceInput=toChangeDeviceInput;   }   //提交會話配置   [self.captureSession commitConfiguration];    }  #pragma mark - 視頻輸出代理 -(void)captureOutput:(AVCaptureFileOutput *)captureOutput didStartRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections{   NSLog(@"開始錄制..."); } -(void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error{   NSLog(@"視頻錄制完成.");   //視頻錄入完成之后在后臺將視頻存儲到相簿   self.enableRotation=YES;   UIBackgroundTaskIdentifier lastBackgroundTaskIdentifier=self.backgroundTaskIdentifier;   self.backgroundTaskIdentifier=UIBackgroundTaskInvalid;   ALAssetsLibrary *assetsLibrary=[[ALAssetsLibrary alloc]init];   [assetsLibrary writeVideoAtPathToSavedPhotosAlbum:outputFileURL completionBlock:^(NSURL *assetURL, NSError *error) {     if (error) {       NSLog(@"保存視頻到相簿過程中發生錯誤,錯誤信息:%@",error.localizedDescription);     }     if (lastBackgroundTaskIdentifier!=UIBackgroundTaskInvalid) {       [[UIApplication sharedApplication] endBackgroundTask:lastBackgroundTaskIdentifier];     }     NSLog(@"成功保存視頻到相簿.");   }];    }  #pragma mark - 通知 /**  * 給輸入設備添加通知  */ -(void)addNotificationToCaptureDevice:(AVCaptureDevice *)captureDevice{   //注意添加區域改變捕獲通知必須首先設置設備允許捕獲   [self changeDeviceProperty:^(AVCaptureDevice *captureDevice) {     captureDevice.subjectAreaChangeMonitoringEnabled=YES;   }];   NSNotificationCenter *notificationCenter= [NSNotificationCenter defaultCenter];   //捕獲區域發生改變   [notificationCenter addObserver:self selector:@selector(areaChange:) name:AVCaptureDeviceSubjectAreaDidChangeNotification object:captureDevice]; } -(void)removeNotificationFromCaptureDevice:(AVCaptureDevice *)captureDevice{   NSNotificationCenter *notificationCenter= [NSNotificationCenter defaultCenter];   [notificationCenter removeObserver:self name:AVCaptureDeviceSubjectAreaDidChangeNotification object:captureDevice]; } /**  * 移除所有通知  */ -(void)removeNotification{   NSNotificationCenter *notificationCenter= [NSNotificationCenter defaultCenter];   [notificationCenter removeObserver:self]; }  -(void)addNotificationToCaptureSession:(AVCaptureSession *)captureSession{   NSNotificationCenter *notificationCenter= [NSNotificationCenter defaultCenter];   //會話出錯   [notificationCenter addObserver:self selector:@selector(sessionRuntimeError:) name:AVCaptureSessionRuntimeErrorNotification object:captureSession]; }  /**  * 設備連接成功  *  * @param notification 通知對象  */ -(void)deviceConnected:(NSNotification *)notification{   NSLog(@"設備已連接..."); } /**  * 設備連接斷開  *  * @param notification 通知對象  */ -(void)deviceDisconnected:(NSNotification *)notification{   NSLog(@"設備已斷開."); } /**  * 捕獲區域改變  *  * @param notification 通知對象  */ -(void)areaChange:(NSNotification *)notification{   NSLog(@"捕獲區域改變..."); }  /**  * 會話出錯  *  * @param notification 通知對象  */ -(void)sessionRuntimeError:(NSNotification *)notification{   NSLog(@"會話發生錯誤."); }  #pragma mark - 私有方法  /**  * 取得指定位置的攝像頭  *  * @param position 攝像頭位置  *  * @return 攝像頭設備  */ -(AVCaptureDevice *)getCameraDeviceWithPosition:(AVCaptureDevicePosition )position{   NSArray *cameras= [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];   for (AVCaptureDevice *camera in cameras) {     if ([camera position]==position) {       return camera;     }   }   return nil; }  /**  * 改變設備屬性的統一操作方法  *  * @param propertyChange 屬性改變操作  */ -(void)changeDeviceProperty:(PropertyChangeBlock)propertyChange{   AVCaptureDevice *captureDevice= [self.captureDeviceInput device];   NSError *error;   //注意改變設備屬性前一定要首先調用lockForConfiguration:調用完之后使用unlockForConfiguration方法解鎖   if ([captureDevice lockForConfiguration:&error]) {     propertyChange(captureDevice);     [captureDevice unlockForConfiguration];   }else{     NSLog(@"設置設備屬性過程發生錯誤,錯誤信息:%@",error.localizedDescription);   } }  /**  * 設置閃光燈模式  *  * @param flashMode 閃光燈模式  */ -(void)setFlashMode:(AVCaptureFlashMode )flashMode{   [self changeDeviceProperty:^(AVCaptureDevice *captureDevice) {     if ([captureDevice isFlashModeSupported:flashMode]) {       [captureDevice setFlashMode:flashMode];     }   }]; } /**  * 設置聚焦模式  *  * @param focusMode 聚焦模式  */ -(void)setFocusMode:(AVCaptureFocusMode )focusMode{   [self changeDeviceProperty:^(AVCaptureDevice *captureDevice) {     if ([captureDevice isFocusModeSupported:focusMode]) {       [captureDevice setFocusMode:focusMode];     }   }]; } /**  * 設置曝光模式  *  * @param exposureMode 曝光模式  */ -(void)setExposureMode:(AVCaptureExposureMode)exposureMode{   [self changeDeviceProperty:^(AVCaptureDevice *captureDevice) {     if ([captureDevice isExposureModeSupported:exposureMode]) {       [captureDevice setExposureMode:exposureMode];     }   }]; } /**  * 設置聚焦點  *  * @param point 聚焦點  */ -(void)focusWithMode:(AVCaptureFocusMode)focusMode exposureMode:(AVCaptureExposureMode)exposureMode atPoint:(CGPoint)point{   [self changeDeviceProperty:^(AVCaptureDevice *captureDevice) {     if ([captureDevice isFocusModeSupported:focusMode]) {       [captureDevice setFocusMode:AVCaptureFocusModeAutoFocus];     }     if ([captureDevice isFocusPointOfInterestSupported]) {       [captureDevice setFocusPointOfInterest:point];     }     if ([captureDevice isExposureModeSupported:exposureMode]) {       [captureDevice setExposureMode:AVCaptureExposureModeAutoExpose];     }     if ([captureDevice isExposurePointOfInterestSupported]) {       [captureDevice setExposurePointOfInterest:point];     }   }]; }  /**  * 添加點按手勢,點按時聚焦  */ -(void)addGenstureRecognizer{   UITapGestureRecognizer *tapGesture=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapScreen:)];   [self.viewContainer addGestureRecognizer:tapGesture]; } -(void)tapScreen:(UITapGestureRecognizer *)tapGesture{   CGPoint point= [tapGesture locationInView:self.viewContainer];   //將UI坐標轉化為攝像頭坐標   CGPoint cameraPoint= [self.captureVideoPreviewLayer captureDevicePointOfInterestForPoint:point];   [self setFocusCursorWithPoint:point];   [self focusWithMode:AVCaptureFocusModeAutoFocus exposureMode:AVCaptureExposureModeAutoExpose atPoint:cameraPoint]; }  /**  * 設置聚焦光標位置  *  * @param point 光標位置  */ -(void)setFocusCursorWithPoint:(CGPoint)point{   self.focusCursor.center=point;   self.focusCursor.transform=CGAffineTransformMakeScale(1.5, 1.5);   self.focusCursor.alpha=1.0;   [UIView animateWithDuration:1.0 animations:^{     self.focusCursor.transform=CGAffineTransformIdentity;   } completion:^(BOOL finished) {     self.focusCursor.alpha=0;   }]; } @end 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美黄色动漫| 亚洲美女性视频| 成人精品久久av网站| 欧美午夜女人视频在线| 在线成人中文字幕| 欧美午夜www高清视频| 最近2019年好看中文字幕视频| 欧美激情一级欧美精品| 精品国偷自产在线| 亚洲精品国精品久久99热| 55夜色66夜色国产精品视频| 精品国产一区二区三区久久狼黑人| 久久韩国免费视频| 亚洲一区二区中文字幕| 91av视频在线播放| 国产亚洲激情视频在线| 成人动漫网站在线观看| 国产欧美日韩最新| 69久久夜色精品国产69乱青草| 欧美日韩成人在线视频| 久久免费视频在线| 久久99久久亚洲国产| 亚洲高清免费观看高清完整版| 欧美亚洲国产日韩2020| 国产免费一区二区三区在线能观看| 欧美成人激情图片网| 日韩中文在线视频| 午夜精品福利视频| 国产色综合天天综合网| 欧美激情一级精品国产| 亚洲国产高潮在线观看| 国产精品成人一区二区| 亚洲色图15p| 日韩日本欧美亚洲| 精品国偷自产在线视频99| 国产999精品视频| 97视频免费在线看| 国产精品丝袜视频| 日本一欧美一欧美一亚洲视频| 亚洲人高潮女人毛茸茸| 国产精品成人免费视频| 亚洲欧美日韩国产成人| 午夜精品福利在线观看| 91成人在线观看国产| 国产精品福利久久久| 欧美久久精品一级黑人c片| 国产做受69高潮| 色yeye香蕉凹凸一区二区av| 国产欧美一区二区三区在线看| 国产视频久久久久| 久久久午夜视频| 午夜精品美女自拍福到在线| 成人观看高清在线观看免费| 成人中文字幕在线观看| 久久久精品2019中文字幕神马| 国产精品一区二区在线| 久久精品99无色码中文字幕| 成人欧美一区二区三区黑人| 91精品国产高清自在线看超| 亚洲欧美一区二区三区四区| 亚洲永久免费观看| 国产欧美亚洲视频| 国产v综合v亚洲欧美久久| 欧美日韩中文在线观看| 日韩欧美国产高清91| 亚洲奶大毛多的老太婆| 91免费看片在线| 最近日韩中文字幕中文| 欧美人在线观看| 日韩欧美在线看| 亚洲最大的成人网| 日韩欧美极品在线观看| 日本免费一区二区三区视频观看| 超碰精品一区二区三区乱码| 色婷婷av一区二区三区久久| 欧美成人免费在线视频| 97在线免费视频| 日韩精品福利网站| 91国内免费在线视频| 国产91ⅴ在线精品免费观看| 欧美精品在线第一页| 日韩免费看的电影电视剧大全| 日韩一区二区久久久| 国产日韩欧美另类| 亚洲欧美日本伦理| 久久久国产影院| 91超碰caoporn97人人| 欧美激情视频免费观看| 国产精品色视频| 久久久视频免费观看| 91中文精品字幕在线视频| 91国产高清在线| 午夜精品久久久久久99热| 欧美视频二区36p| 成人春色激情网| 欧美男插女视频| 亚洲欧美色图片| 日韩一区二区三区在线播放| 日本免费一区二区三区视频观看| 97精品免费视频| 亚洲精品在线91| 国产噜噜噜噜久久久久久久久| 久久久精品一区二区三区| 日韩人体视频一二区| 精品国偷自产在线视频99| 亚洲自拍偷拍福利| 日韩国产精品一区| 日韩电影在线观看中文字幕| 日本精品在线视频| 欧美日韩成人免费| www.亚洲天堂| 欧美亚洲在线视频| 日韩一区二区三区在线播放| 成人性教育视频在线观看| 成人春色激情网| 国产亚洲成精品久久| 国产精品一区二区三区久久| 在线一区二区日韩| 国产精品69av| 国产美女精品免费电影| 午夜精品久久久久久久久久久久| 综合网日日天干夜夜久久| 亚洲大胆美女视频| 亚洲一区二区精品| 国产精品亚洲综合天堂夜夜| 亚洲欧洲免费视频| 97婷婷大伊香蕉精品视频| 神马国产精品影院av| 久久综合免费视频| 欧美一级bbbbb性bbbb喷潮片| 日韩精品视频在线免费观看| 亚洲第一页在线| 久久久国产91| 日韩电影免费在线观看| 91精品视频在线播放| 九九久久国产精品| 久久99精品久久久久久噜噜| 亚洲毛片在线观看.| 日本免费久久高清视频| 久久人人爽人人爽爽久久| 成人xvideos免费视频| 免费91在线视频| 夜夜嗨av色综合久久久综合网| 欧美一级视频免费在线观看| 国产精品免费久久久| 久久国产一区二区三区| 隔壁老王国产在线精品| 日韩不卡在线观看| 欧美大胆在线视频| 91亚洲精品在线观看| 欧美日韩午夜视频在线观看| 中文字幕综合一区| 欧美成人午夜剧场免费观看| 欧美激情伊人电影| 亚洲成成品网站| 成人国产精品av| 国产福利视频一区二区| 久久综合久久美利坚合众国| 亚洲男人7777| 91老司机精品视频| 亚洲人在线观看| 91人成网站www| 久久久极品av| 自拍偷拍亚洲区|