所以,我正在尝试使用 AVFoundation 实现相机。我想我做的一切都是对的。这就是我正在做的事情
- 创建会话
- 获取视频类型的设备
- 循环遍历设备以获取后面的摄像头
- 使用 #3 中提到的设备获取设备输入并将其添加到会话中
- 创建类型的输出
AVCaptureStillImageOutput
- 设置输出设置并将其添加到会话中
- 从我的视图 2 中获取 CALayer(下面将解释视图 2 的含义)
- 创建一个实例
AVCaptureVideoPreviewLayer
- 将其添加到#7中提到的层
- 开始运行会话
所以我有两种观点,一种是另一种。上面的一个是视图 1,下面的一个是视图 2。视图 1 应该提供自定义相机控件。
这是代码:
self.session = [[AVCaptureSession alloc]init];
[self.session setSessionPreset:AVCaptureSessionPresetHigh];
NSArray *devices = [[NSArray alloc]init];
devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *device in devices){
if([device position] == AVCaptureDevicePositionBack){
self.device = device;
break;
}
}
NSError *error;
self.input = [[AVCaptureDeviceInput alloc]initWithDevice:self.device error:&error];
if([self.session canAddInput:self.input]){
[self.session addInput:self.input];
}
self.stillImageOutput = [[AVCaptureStillImageOutput alloc]init];
NSDictionary *outputSettings = @{AVVideoCodecKey : AVVideoCodecJPEG};
[self.stillImageOutput setOutputSettings:outputSettings];
[self.session addOutput:self.stillImageOutput];
CALayer *cameraLayer = self.cameraView.layer;
self.cameraView.backgroundColor = [UIColor clearColor];
AVCaptureVideoPreviewLayer *preview = [[AVCaptureVideoPreviewLayer alloc]initWithSession:self.session];
[cameraLayer addSublayer:preview];
[self.session startRunning];
我得到的是视图 1(它有一个 .png 图像作为背景。该图像有一个洞,以便其下方的视图、视图 2 可见),视图 2 可见,但我没有看到我应该看到的内容。因为我将视图 2 的背景颜色更改为透明颜色,所以我看到全黑。我应该看到相机看到的东西。
事实证明,您必须设置框架、maskToBounds 和重力才能使预览图层正常工作。我就是这样做的
CALayer *cameraLayer = self.cameraView.layer;
self.cameraView.backgroundColor = [UIColor clearColor];
[cameraLayer setMasksToBounds:YES];
AVCaptureVideoPreviewLayer *preview = [[AVCaptureVideoPreviewLayer alloc]initWithSession:self.session];
[preview setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[preview setFrame:[cameraLayer bounds]];
[cameraLayer addSublayer:preview];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)