2013-05-13 41 views
9

カメラの入力をプレビューレイヤービューで表示しようとしました。AVCaptureVideoPreviewLayerにカメラプレビューを取得

self.cameraPreviewViewがIB

でのUIViewに結ばれここに私がAV財団プログラミングガイドから一緒に入れ私の現在のコードです。しかし、プレビューが

AVCaptureSession *session = [[AVCaptureSession alloc] init]; 
    session.sessionPreset = AVCaptureSessionPresetHigh; 

    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 

    NSError *error = nil; 
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; 

    if (!input) { 
     NSLog(@"Couldn't create video capture device"); 
    } 
    [session addInput:input]; 


     // Create video preview layer and add it to the UI 
     AVCaptureVideoPreviewLayer *newCaptureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; 
     UIView *view = self.cameraPreviewView; 
     CALayer *viewLayer = [view layer]; 

     newCaptureVideoPreviewLayer.frame = view.bounds; 

     [viewLayer addSublayer:newCaptureVideoPreviewLayer]; 

     self.cameraPreviewLayer = newCaptureVideoPreviewLayer; 



     [session startRunning]; 
+0

を参照することができます newCaptureVideoPreviewLayer.frame = self.cameraPreviewView.bounds ...コードの下に試すことができます。 [self.cameraPreviewView.layer addSublayer:newCaptureVideoPreviewLayer]; [session startRunning]; – BhushanVU

+0

@bhuXan - ちょうど試したが、まだ黒い眺め。 –

答えて

19

を示したことがないので、いくつかの試行錯誤とリンゴのAVCamサンプルコードを見て

後、私はそうのようなグランドセントラル派遣ブロックにPreviewLayerコードとセッションstartRunningを包み、それが仕事を始めました。ここ

dispatch_async(dispatch_get_main_queue(), ^{ 
    AVCaptureVideoPreviewLayer *newCaptureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; 
    UIView *view = self.cameraPreviewView; 
    CALayer *viewLayer = [view layer]; 

    newCaptureVideoPreviewLayer.frame = view.bounds; 

    [viewLayer addSublayer:newCaptureVideoPreviewLayer]; 

    self.cameraPreviewLayer = newCaptureVideoPreviewLayer; 

    [session startRunning]; 
}); 
+6

ここで最もトリッキーな行は** [セッション開始練習]です**、ほとんどのチュートリアルでは不幸なので、**です。 –

+0

申し訳ありませんが、 'self.cameraPreviewLayer'とは何か分かりませんでしたか?混乱していると、それは明らかにそのメッセージが –

17

が、それは私のために完璧に動作し、私のコードで、あなたはそれに

- (void)initCapture 
{ 
    AVCaptureDevice *inputDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
    AVCaptureDeviceInput *captureInput = [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:nil]; 
    if (!captureInput) { 
     return; 
    } 
    AVCaptureVideoDataOutput *captureOutput = [[AVCaptureVideoDataOutput alloc] init]; 
    /* captureOutput:didOutputSampleBuffer:fromConnection delegate method !*/ 
    [captureOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; 
    NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey; 
    NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA]; 
    NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key]; 
    [captureOutput setVideoSettings:videoSettings]; 
    self.captureSession = [[AVCaptureSession alloc] init]; 
    NSString* preset = 0; 
    if (!preset) { 
     preset = AVCaptureSessionPresetMedium; 
    } 
    self.captureSession.sessionPreset = preset; 
    if ([self.captureSession canAddInput:captureInput]) { 
     [self.captureSession addInput:captureInput]; 
    } 
    if ([self.captureSession canAddOutput:captureOutput]) { 
     [self.captureSession addOutput:captureOutput]; 
    } 

    //handle prevLayer 
    if (!self.captureVideoPreviewLayer) { 
     self.captureVideoPreviewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.captureSession]; 
    } 

    //if you want to adjust the previewlayer frame, here! 
    self.captureVideoPreviewLayer.frame = self.view.bounds; 
    self.captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
    [self.view.layer addSublayer: self.captureVideoPreviewLayer]; 
    [self.captureSession startRunning]; 
} 
+1

である場合、私たちにエラーが表示されます。また、dispatch_asyncブロックでラップすることもできます。 – jianpx

+0

ありがとうございました:-) –

+0

これは実際に記録されますか? – user717452

関連する問題