5

そこで、AVFoundation を使用してカメラを実装しようとしています。私はすべてを正しくしていると思います。これが私がしていることです

  1. セッションを作成
  2. ビデオ タイプのデバイスを取得する
  3. 背面のカメラを取得するためにデバイスをループします
  4. #3で述べたデバイスを使用してデバイス入力を取得し、それをセッションに追加します
  5. タイプの出力を作成するAVCaptureStillImageOutput
  6. 出力設定を設定し、セッションに追加します
  7. ビュー 2 から CALayer を取得します (ビュー 2 の意味を以下で説明します)
  8. のインスタンスを作成するAVCaptureVideoPreviewLayer
  9. #7で述べたレイヤーに追加します
  10. セッションの実行を開始します

だから私は2つのビューをもう一方の上に持っています。上がビュー 1 で、下がビュー 2 です。ビュー 1 は、カスタム カメラ コントロールを提供することになっています。

コードは次のとおりです。

self.session = [[AVCaptureSession alloc]init];
[self.session setSessionPreset:AVCaptureSessionPresetHigh];
NSArray *devices = [[NSArray alloc]init];
devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *device in devices){
    if([device position] == AVCaptureDevicePositionBack){
        self.device = device;
        break;
    }
}
NSError *error;
self.input = [[AVCaptureDeviceInput alloc]initWithDevice:self.device error:&error];
if([self.session canAddInput:self.input]){
    [self.session addInput:self.input];    
}


self.stillImageOutput = [[AVCaptureStillImageOutput alloc]init];
NSDictionary *outputSettings = @{AVVideoCodecKey : AVVideoCodecJPEG};
[self.stillImageOutput setOutputSettings:outputSettings];

[self.session addOutput:self.stillImageOutput];

CALayer *cameraLayer = self.cameraView.layer;
self.cameraView.backgroundColor = [UIColor clearColor];

AVCaptureVideoPreviewLayer *preview = [[AVCaptureVideoPreviewLayer alloc]initWithSession:self.session];
[cameraLayer addSublayer:preview];

[self.session startRunning];

私が得るのはビュー1(背景として.png画像があります。画像には穴があり、その下にビューが表示され、ビュー2が表示されます)とビュー2が表示されますが、私が想定しているものは表示されません。ビュー 2 の背景色をクリア カラーに変更したため、すべて黒く見えます。私はカメラが見ているものを見ることになっています。

4

1 に答える 1

7

プレビュー レイヤーが正しく機能するには、frame、maskToBounds、および重力を設定する必要があることがわかりました。これが私がやった方法です

CALayer *cameraLayer = self.cameraView.layer;
self.cameraView.backgroundColor = [UIColor clearColor];
[cameraLayer setMasksToBounds:YES];
AVCaptureVideoPreviewLayer *preview = [[AVCaptureVideoPreviewLayer alloc]initWithSession:self.session];
[preview setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[preview setFrame:[cameraLayer bounds]];


[cameraLayer addSublayer:preview];
于 2013-10-14T09:13:28.290 に答える