web-dev-qa-db-fra.com

AVCaptureVideoPreviewLayer ne remplit pas tout l'écran de l'iPhone 4S

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

J'utilise AVCaptureVideoPreviewLayer pour afficher la vidéo sur la vue. Mais la vue de la vidéo n'a pas rempli l'écran complet de l'iPhone4 (deux barres grises à droite et à gauche)

Je veux que la vidéo se remplisse plein écran. Comment puis-je y faire face? Merci beaucoup!

enter image description here

62
Rafer

Peut-être que cela le résout?

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

Une source potentielle de confusion est que le AVCaptureVideoPreviewLayer est une couche CoreAnimation et dans toutes les réponses ci-dessus est positionné statiquement (par exemple sans contraintes) par rapport à une vue. Si vous utilisez des contraintes pour mettre en page la vue, celles-ci ne redimensionnent pas automatiquement le calque d'aperçu.

Cela signifie que vous ne pouvez pas configurer la couche d'aperçu dans viewDidLoad car la mise en page n'a pas encore eu lieu et la couche d'aperçu dimensionnera la façon dont elle était dans Interface Builder.

À la place, remplacez viewDidLayoutSubviews sur votre ViewController et placez-y le calque d'aperçu.

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

La réponse de @ fitzwald vous donnera le résultat souhaité, mais il existe un moyen plus simple. Ce qui se passe, c'est que le préréglage de session est par défaut Vidéo - Élevé (qui ne correspond pas au rapport d'aspect de l'écran). Un aperçu plein écran (comme dans Camera.app) peut être obtenu en utilisant le préréglage photo. Réglez simplement

session.sessionPreset = AVCaptureSessionPresetPhoto;

avant de commencer votre session. Voici le Documentation Apple si vous voulez en savoir plus.

11
eschurter

Pour Google, c'est la réponse acceptée mais en utilisant Swift qui est légèrement différent:

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

La réponse acceptée

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)
3
Allen

J'utilise le code suivant pour y parvenir

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