首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >AVCaptureVideoPreviewLayer显示正确,但iPhone6除外

AVCaptureVideoPreviewLayer显示正确,但iPhone6除外
EN

Stack Overflow用户
提问于 2015-06-10 09:59:48
回答 2查看 1.5K关注 0票数 1

我正在实现一个由AVCaptureVideoPreviewLayer组成的视图。视图应该占据整个屏幕,但顶部的导航栏除外(视图嵌入到导航控制器中)。

下面的代码展示了我是如何设置一个捕获会话的,并在可用的情况下添加了前置摄像头作为输入。

代码语言:javascript
运行
AI代码解释
复制
//Set up capture Session
session = [[AVCaptureSession alloc]init];
session.sessionPreset = AVCaptureSessionPresetPhoto;

//Add a camera as input if we have a front-facing camera available
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
NSError *error;

for (AVCaptureDevice *device in devices) {
    if ([device position] == AVCaptureDevicePositionBack) {
        //Set our input
        AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
        [session addInput:input];
        if (!input) {
            NSLog(@"No Input");
        }
    }
}

下面是配置输出的地方,相机输出视图作为子视图添加,帧由视图的边界决定。

代码语言:javascript
运行
AI代码解释
复制
//Output
AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];
[session addOutput:output];
output.videoSettings = @{ (NSString *)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA) };

//Preview Layer
AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
previewLayer.frame = self.view.bounds;
self.view.translatesAutoresizingMaskIntoConstraints = NO;

previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
[self.view.layer addSublayer:previewLayer];

在iPhone 6上运行时,您可以在下面的屏幕截图中看到,预览层不占用整个屏幕(相机视图右侧和导航栏下的空白应由预览层填充):

但是,它确实在下面的iPhone 5屏幕截图(以及iPhone 4、4S和5S)上适当地填充了屏幕。有谁知道原因吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-10 11:32:07

假设您要在viewDidLoad中创建这个视频预览层,视图控制器的视图还没有布局,因此当视图在屏幕上显示时,它的framebounds并不一定是它们的样子。您必须等到视图布局好才能设置预览层的正确框架,这可以通过实现视图控制器的viewDidLayoutSubviews方法来实现,如下所示:

代码语言:javascript
运行
AI代码解释
复制
- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    self.previewLayer.frame = self.view.bounds;
}

这可以确保任何时候视图控制器的视图在大小上都会发生变化,预览层的大小也会发生变化。

票数 1
EN

Stack Overflow用户

发布于 2015-06-10 11:33:36

您可以使用AVCaptureVideoPreviewLayer作为UIView子类的支持层,然后将该视图的实例作为子视图添加到视图控制器的视图中。通过这种方式,您可以使用约束来定位您想要的视频捕获预览,就像您使用任何其他视图一样。

下面是一个如何做到这一点的例子:

代码语言:javascript
运行
AI代码解释
复制
// MyCaptureVideoPreviewView.h

#import <AVFoundation/AVFoundation.h>

@interface MyCaptureVideoPreviewView : UIView

@property (nonatomic, readonly) AVCaptureVideoPreviewLayer *layer;
@property (nonatomic) AVCaptureSession *session;

- (instancetype)initWithFrame:(CGRect)frame session:(AVCaptureSession *)session;

@end


// MyCaptureVideoPreviewView.m

@implementation MyCaptureVideoPreviewView

@dynamic layer;

+ (Class)layerClass {
    return [AVCaptureVideoPreviewLayer class];
}

- (AVCaptureSession *)session {
    return self.layer.session;
}

- (void)setSession:(AVCaptureSession *)session {
    self.layer.session = session;
}

- (instancetype)initWithFrame:(CGRect)frame session:(AVCaptureSession *)session {
    self = [super initWithFrame:frame];
    if (self) {
        self.session = session;
    }
    return self;
}

@end

然后在视图控制器实现中的某个位置:

代码语言:javascript
运行
AI代码解释
复制
MyCaptureVideoPreviewView *previewView = [[MyCaptureVideoPreviewView alloc] initWithFrame:self.view.bounds
                                                                                  session:session];
previewView.layer.videoGravity = AVLayerVideoGravityResizeAspectFill;
previewView.translatesAutoresizingMaskIntoConstraints = NO;

[self.view addSubview:previewView];

// Add whatever constraints you want. Here we just match the superview's bounds:
NSArray *vConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[previewView]|" options:kNilOptions
                                                                metrics:nil views:NSDictionaryOfVariableBindings(previewView)];
NSArray *hConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[previewView]|" options:kNilOptions
                                                                metrics:nil views:NSDictionaryOfVariableBindings(previewView)];

[self.view addConstraints:vConstraints];
[self.view addConstraints:hConstraints];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30763887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档