基本概念 iPhone包括了摄像头,麦克风等设备,我们用 AVCaptureDevice 代表它们。 AVCaptureDevice对象代表了一个物理设备及与设备相关的属性。 可以使有 AVCaptureDevice 的类方法枚举所有有效的设备,并查询它们的能力。当设备有效或无效时,AVCaptureDevice会得到系统的通知。 根据视频类型 AVMediaTypeVideo,创建 AVCaptureDevice 对象。(可以创建视频设备也可以创建音频设备)。 以 AVCaptureDevice 为参数,创建 AVCaptureDeviceInput 对象。
我将其封装为类方法直接调用即可 /** 开或关 闪光灯 */ + (void)changeFlash { // 获取摄像机单例对象 AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; //必须判定是否有闪光灯,否则如果没有闪光灯会崩溃 if AVCaptureTorchModeOff; } [device unlockForConfiguration]; } /** 关灯 用于退出时调用 */ + (void)closeFlash { AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if (!
output 进 sesstion 中时,都会建立一个 connection用来管理他们,当然不限于一个 input 和 output,具体如下 image 2: [image 2] 常用视频采集涉及对象说明 AVCaptureDevice avCaptureSession.sessionPreset = AVCaptureSessionPreset1280x720; } 设置分辨率可参考官网文档中参数: [image 4] 添加inout //获取摄像头 AVCaptureDevice *captureDevice = [[AVCaptureDevice alloc] init]; NSArray *devices = [AVCaptureDevice devices]; for (AVCaptureDevice *device in devices) { if(device.position == AVCaptureDevicePositionFront) {
1.常用的类 AVCaptureSession 捕捉绘画 相当于插板的功能承接输入和输出 AVCaptureDevice 捕捉设备 AVMediaTypeVideo/AVMediaTypeAudio self.captureSession.sessionPreset = AVCaptureSessionPresetHigh; //拿到默认视频捕捉设备 iOS系统返回后置摄像头 AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; //将捕捉设备封装成AVCaptureDeviceInput *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; //为这个设备创建一个捕捉设备输入 videoConnection.enablesVideoStabilizationWhenAvailable = YES; } AVCaptureDevice
为了管理从相机或者麦克风等这样的设备捕获到的信息,我们需要输入对象(input)和输出对象(output),并且使用一个会话(AVCaptureSession)来管理 input 和 output 之前的数据流: 类名 简介 AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; // 在这个方法中的 mediaType 有三个选项供我们使用 // AVMediaTypeVideo 视频 // AVMediaTypeAudio 音频 // AVMediaTypeMuxed 混合(视频 + 音频) + (nullable AVCaptureDevice *)defaultDeviceWithMediaType:(AVMediaType)mediaType; 但是这种方式只能获取到后置摄像头,如果想要获取前置摄像头,可使用 AVCaptureDevice *videoDevice; NSArray *devices = [AVCaptureDevice devices]; for (AVCaptureDevice *device in devices)
设置视频输入源与输出源 // 设置视频输入源 guard let devices = AVCaptureDevice.devices() as? [AVCaptureDevice] else { return } // 获取我们的前置摄像头(后置为.back) guard let device = devices.filter({ $0.position output.setSampleBufferDelegate(self, queue: queue) self.videoOutput = output 设置音频的输入源与输出源 // 设置音频的输入源 guard let device = AVCaptureDevice.defaultDevice .back : .front guard let devices = AVCaptureDevice.devices() as? [AVCaptureDevice] else { return } guard let device = devices.filter({ $0.position == position }).first
AVCaptureDevice:输入设备,如麦克风、摄像头。 AVCaptureDeviceInput:设备输入数据管理对象,可以根据AVCaptureDevice创建对应的AVCaptureDeviceInput对象,该对象将会被添加到AVCaptureSession 运行环境:Xcode 8.3.2 + iOS 8. 4真机、iOS 10.3.1真机 核心步骤: 1、创建AVCaptureSession会话 2、创建AVCaptureDevice设备 3、创建输入 strong) AVCaptureVideoPreviewLayer *layer; @end @implementation ViewController #pragma mark - 懒加载 -(AVCaptureDevice *)device{ if (_device == nil) { _device = [AVCaptureDevice defaultDeviceWithMediaType
高帧率下 Apple 弃用了这种方式,要求我们为 AVCaptureDevice 指定合适的 activeFormat 格式。 现在 AVCaptureSession 已经被创建完成,紧接着我们的任务是为它添加具体的采集输入设备 (AVCaptureDevice)。 在之前的文章中我们已经知道,AVCaptureDevice 是一个抽象类,每个具体的示例都会对应一个设备,例如摄像机或麦克风。 AVCaptureDevice 的创建有两种方式,第一种是通过 AVCaptureDevice 提供的类方法,另外一种是通过 AVCaptureDeviceDiscoverySession 提供的类方法 [AVCatpureDeviceInput deviceInputWithDevice:AVCaptureDevice error:NSError]; 接下来就是将 AVCaptureDeviceInput
self, queue: DispatchQueue(label: "AudioQueue")) } private func getVideoInput(position: AVCaptureDevice.Position device: device) } return nil } private func getVideoCaptureDevice(position: AVCaptureDevice.Position ) -> AVCaptureDevice? { if #available(iOS 10.2, *) { var deviceTypes: [AVCaptureDevice.DeviceType] = [. deviceTypes.append(.builtInTrueDepthCamera) } let discoverySession = AVCaptureDevice.DiscoverySession
/** 该方法会返回当前能够输入视频的全部设备,包括前后摄像头和外接设备 NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType :AVMediaTypeVideo]; 该方法会返回当前能够输入音频的全部设备 NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType :AVMediaTypeAudio]; */ // 获取视频输入设备,该方法默认返回iPhone的后置摄像头 AVCaptureDevice *videoDevice = [AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; AVCaptureDeviceInput *device = (AVCaptureDevice *)object; if (!
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if (device.torchMode
session.AVCaptureSession *captureSession = [[AVCaptureSession alloc] init]; // Lookup the default audio device.AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; // Wrap the audio device AVCaptureInput 与 AVCaptureSession 相关联,在 AVCaptureSession 上调用addInput: AVCaptureDeviceInput 捕获输入对象,用于从 AVCaptureDevice 创建 AVCaptureInput 时需要指定 AVCaptureDevice, AVCaptureDevice 决定了捕获的数据类型 AVCaptureScreenInput 提供录屏捕获输入 AVCaptureMetadataInput
2、通过 AVCaptureDevice 的类方法 defaultDeviceWithMediaType 区别 MediaType 得到 AVCaptureDevice 对象。 3、得到上面的 AVCaptureDevice 对象之后,就是我们的 AVCaptureDeviceInput 输入对象了。 捕获设备类 AVCaptureDeviceInput 捕获设备输入类 */ AVCaptureDevice * captureDevice = [AVCaptureDevice * audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; AVCaptureDeviceInput 捕获设备类 AVCaptureDeviceInput 捕获设备输入类 */ AVCaptureDevice * videoDevice
cgimg); return img; } 自定义相机拍照视图 定义变量 //捕获设备,通常是前置摄像头,后置摄像头,麦克风(音频输入) @property (nonatomic, strong) AVCaptureDevice *device; //AVCaptureDeviceInput 代表输入设备,他使用AVCaptureDevice 来初始化 @property (nonatomic, strong) AVCaptureDeviceInput *)cameraWithPosition:(AVCaptureDevicePosition)position{ NSArray *devices = [AVCaptureDevice devicesWithMediaType :AVMediaTypeVideo]; for ( AVCaptureDevice *device in devices ) if ( device.position == position otherButtonTitles:nil]; [alert show]; } 前后置摄像头的切换 - (void)changeCamera{ NSUInteger cameraCount = [[AVCaptureDevice
添加四个私有成员,获取AVFoundation的“终端”、“输入”、“输出”、“管理员”对象: @implementation DTCameraPreviewController { AVCaptureDevice AVCaptureStillImageOutput *_imageOutput; AVCaptureSession *_captureSession; } 选取录制设备(摄像头或麦克风) AVCaptureDevice setupCamera方法,用来初始化若干个AVFoundation中用于录制的对象, - (void)_setupCamera { //获取到一个录制设备(摄像头) _camera = [AVCaptureDevice unlockForConfiguration]; } } } 抓取照片 完整的_setupCamera: - (void)_setupCamera { _camera = [AVCaptureDevice
Restricted"); } }]; 相机和麦克风权限 导入头文件@import AVFoundation; 检查是否有相机或麦克风权限 AVAuthorizationStatus AVstatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];//相机权限 AVAuthorizationStatus AVstatus = [AVCaptureDevice AVAuthorizationStatusRestricted: NSLog(@"Restricted"); break; default: break; } 获取相机或麦克风权限 [AVCaptureDevice {//相机权限 if (granted) { NSLog(@"Authorized"); }else{ NSLog(@"Denied or Restricted"); } }]; [AVCaptureDevice
nonatomic, strong, readwrite) KFVideoCaptureConfig *config; @property (nonatomic, strong, readonly) AVCaptureDevice }); } #pragma mark - Private Method - (void)_startRunning { AVAuthorizationStatus status = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; #pragma GCC diagnostic pop } for (AVCaptureDevice 从代码上可以看到主要有这几个部分: 1)创建采集设备 AVCaptureDevice。 在 -captureDevice 中实现。 [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
AVCaptureDevice:硬件设备,包括麦克风、摄像头,通过该对象可以设置物理设备的一些属性(例如相机聚焦、白平衡等) AVCaptureDeviceInput:硬件输入对象,可以根据AVCaptureDevice 3.根据音频/视频硬件设备(AVCaptureDevice)创建音频/视频硬件输入数据对象(AVCaptureDeviceInput),专门管理数据输入。
captureSession.sessionPreset = .high captureSession.beginConfiguration() //配置输入设备 AVCaptureDevice.devices AVCaptureInput与AVCaptureDevice 设备输入数据管理对象,可以根据AVCaptureDevice创建对应AVCaptureDeviceInput对象,该对象将会被添加到AVCaptureSession captureSession.sessionPreset = .high captureSession.beginConfiguration() //配置输入设备 AVCaptureDevice.devices
Restricted"); } }]; 相机和麦克风权限 导入头文件@import AVFoundation; 检查是否有相机或麦克风权限 AVAuthorizationStatus AVstatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];//相机权限 AVAuthorizationStatus AVstatus = [AVCaptureDevice case AVAuthorizationStatusRestricted: NSLog(@"Restricted"); break; default: break; } 获取相机或麦克风权限 [AVCaptureDevice ) {//相机权限 if (granted) { NSLog(@"Authorized"); } else{ NSLog(@"Denied or Restricted"); }}]; [AVCaptureDevice