AVCaptureVideoPreviewLayer没有填满整个iPhone 4S屏幕

Raf*_*fer 63 iphone avfoundation ios4

AVCaptureVideoPreviewLayer *avLayer = 
                [AVCaptureVideoPreviewLayer layerWithSession:session];
avLayer.frame = self.view.frame;
[self.view.layer addSublayer:avLayer];
Run Code Online (Sandbox Code Playgroud)

我使用AVCaptureVideoPreviewLayer在视图上显示视频.但视频的视图并没有填满整个iPhone4的屏幕.(右侧和左侧有两个灰色条)

我希望视频能够全屏显示.我怎么处理它?非常感谢你!

在此输入图像描述

fli*_*ald 186

也许这解决了吗?

CGRect bounds=view.layer.bounds;
avLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
avLayer.bounds=bounds;
avLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
Run Code Online (Sandbox Code Playgroud)


mar*_*rko 13

混淆的一个潜在原因是,它AVCaptureVideoPreviewLayer是CoreAnimation层,并且在上面的所有答案中,相对于视图静态地定位(例如,没有约束).如果使用约束来布局视图,则这些不会自动调整预览图层的大小.

这意味着您无法设置预览图层,viewDidLoad因为布局尚未发生,预览图层将在Interface Builder中调整大小.

相反,覆盖viewDidLayoutSubviews你的ViewController并在那里定位预览图层.

- (void)viewDidLayoutSubviews
{
    CGRect bounds=view.layer.bounds;
    avLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;  
    avLayer.bounds=bounds;
    avLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
}
Run Code Online (Sandbox Code Playgroud)


esc*_*ter 11

@ fitzwald的答案将为您提供所需的结果,但有一种更简单的方法.发生的事情是会话预设默认为视频 - 高(与屏幕的宽高比不匹配).使用Photo预设可以实现全屏预览(如在Camera.app中).简单的设置

session.sessionPreset = AVCaptureSessionPresetPhoto;
Run Code Online (Sandbox Code Playgroud)

在开始你的会议之前.如果您想了解更多信息,请参阅Apple文档.

  • 我认为那是错的.两件事:首先,使用presetPhoto打破内置行为(例如,如果设置此预设,AVCaptureVideoPreviewLayer将拒绝流式传输实时视频).其次,我发现它仍然不会自动调整大小来填充CALayer. (4认同)

Raj*_*Raj 8

为了谷歌的缘故,这是公认的答案,但使用的Swift略有不同:

var bounds:CGRect = self.view.layer.bounds
previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
previewLayer?.bounds = bounds
previewLayer?.position = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds))
Run Code Online (Sandbox Code Playgroud)