5

所以,我正在尝试使用 AVFoundation 实现相机。我认为我做的一切都是正确的。这就是我正在做的

  1. 创建会话
  2. 获取视频类型的设备
  3. 遍历设备以将相机放在后面
  4. 使用#3 中提到的设备获取设备输入并将其添加到会话中
  5. 创建类型的输出AVCaptureStillImageOutput
  6. 设置输出设置并将其添加到会话中
  7. 从我的视图 2 中获取 CALayer(将在下面解释我的视图 2 的意思)
  8. 创建一个实例AVCaptureVideoPreviewLayer
  9. 将其添加到 #7 中提到的层
  10. 开始运行会话

所以我有 2 个视图,一个在另一个之上。顶部是视图 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 的背景颜色更改为清除颜色,所以我看到全黑。我应该看看相机看到了什么。

4

1 回答 1

7

事实证明,您必须设置框架、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];
于 2013-10-14T09:13:28.290 回答