AVCaptureVideoPreviewLayer


AVCaptureVideoPreviewLayer *avLayer = 
                [AVCaptureVideoPreviewLayer layerWithSession:session];
avLayer.frame = self.view.frame;
[self.view.layer addSublayer:avLayer];

Я использую AVCaptureVideoPreviewLayer для отображения видео на вид. Но вид видео не заполнял весь экран iPhone4.(две серые полосы справа и слева)

Я хочу, чтобы видео заполняет весь экран. Как я могу с этим справиться? Большое спасибо!

6 60

6 ответов:

может быть, это решает он?

CGRect bounds=view.layer.bounds;
avLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
avLayer.bounds=bounds;
avLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));

одной из потенциальных причин путаницы является то, что AVCaptureVideoPreviewLayer является слоем CoreAnimation и во всех ответах выше позиционируется статически (например, без ограничений) относительно вида. Если вы используете ограничения для компоновки представления, они не изменяют автоматически размер слоя предварительного просмотра.

это означает, что вы не можете настроить слой предварительного просмотра в viewDidLoad поскольку макет еще не состоялся, и слой предварительного просмотра будет иметь размер, как это было в интерфейсе Строитель.

вместо этого, переопределить viewDidLayoutSubviews на ViewController и расположите слой предпросмотра.

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

ответ@fitzwald даст вам желаемый результат, но есть более простой способ. Что происходит, так это то, что предустановка сеанса по умолчанию имеет значение Video - High (что не соответствует соотношению сторон экрана). Полноэкранный просмотр (например, в камере.приложение) может быть достигнуто с помощью предустановленной фотографии. Просто установите

session.sessionPreset = AVCaptureSessionPresetPhoto;

перед началом сессии. Вот это Документация Apple если вы хотите узнать больше.

ради Google, это принятый ответ, но с помощью Swift, который немного отличается:

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

принятый ответ

Swift 3:

  let bounds = view.layer.bounds
  self.cameraLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
  self.cameraLayer.bounds = bounds
  self.cameraLayer.position = CGPoint(x:bounds.midX, y:bounds.midY)
  self.cameraView?.layer.addSublayer(self.cameraLayer)

Swift 4:

  let bounds = view.layer.bounds
  self.cameraLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
  self.cameraLayer.bounds = bounds
  self.cameraLayer.position = CGPoint(x:bounds.midX, y:bounds.midY)
  self.cameraView?.layer.addSublayer(self.cameraLayer)

Я использую следующий код, чтобы добиться этого

previewLayer.frame = CGRectMake(0, 0, self.view.frame.size.width,self.view.frame.size.height);
previewLayer.orientation = [[UIDevice currentDevice] orientation];
previewLayer.contentsGravity = kCAGravityResizeAspectFill;