web-dev-qa-db-ja.com

AVCaptureVideoPreviewLayerがiPhone 4Sの画面全体に表示されない

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

AVCaptureVideoPreviewLayerを使用して、ビューにビデオを表示します。しかし、ビデオのビューは、iPhone4の画面全体を埋めることはできませんでした(右側と左側にある2つの灰色のバー)

ビデオがフルスクリーンいっぱいになるようにします。どうすれば対処できますか?どうもありがとうございました!

enter image description here

62
Rafer

たぶんこれで解決しますか?

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

混乱の原因の1つは、AVCaptureVideoPreviewLayerがCoreAnimationレイヤーであり、上記のすべての回答でビューに対して静的に(たとえば、制約なしで)配置されていることです。ビューのレイアウトに制約を使用する場合、これらはプレビューレイヤーのサイズを自動的に変更しません。

これは、レイアウトがまだ実行されておらず、Interface Builderでのプレビューレイヤーのサイズが変更されるため、viewDidLoadでプレビューレイヤーを設定できないことを意味します。

代わりに、viewDidLayoutSubviewsViewControllerをオーバーライドし、プレビューレイヤーをそこに配置します。

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

@fitzwaldの答えはあなたに望ましい結果を与えますが、もっと簡単な方法があります。何が起こっているのかというと、セッションプリセットはデフォルトでビデオ-高(画面の縦横比と一致しません)になっています。 (Camera.appのような)全画面プレビューは、Photoプリセットを使用して実現できます。設定するだけ

session.sessionPreset = AVCaptureSessionPresetPhoto;

セッションを開始する前に。詳細については Apple Documentation をご覧ください。

11
eschurter

Googleのために、これは受け入れられた答えですが、Swiftを使用しますが、これは少し異なります:

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

受け入れられた答え

スウィフト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

私はこれを達成するために次のコードを使用します

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