2013-05-13 24 views
9

Próbowałem uzyskać wejście kamery do wyświetlenia w widoku warstwy podglądu.Pobierz podgląd kamery na AVCaptureVideoPreviewLayer

self.cameraPreviewView jest przywiązany do UIView w IB

Tu jest mój bieżący kod, który ułożyła z Programming Guide Fundacji AV. Ale podgląd nigdy nie pokazuje

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

można spróbować poniżej kodu ... newCaptureVideoPreviewLayer.frame = self.cameraPreviewView.bounds; [self.cameraPreviewView.layer addSublayer: newCaptureVideoPreviewLayer]; [session startRunning]; – BhushanVU

+0

@bhuXan - Po prostu wypróbowany i nadal czarny widok. –

Odpowiedz

19

Więc po pewnym prób i błędów i patrząc na Apple AVCam Kod Przykładowy

ja owinięty kod PreviewLayer i sesji startRunning do wielkiego centralnego bloku wysyłkowy jak tak i zaczęło działać.

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

Najtrudniejszym wierszem tutaj jest ** [session startRunning]; ** ponieważ nie jest prezentowany w większości samouczków, niestety. –

+0

Przepraszam, że nie rozumiem dokładnie czym jest 'self.cameraPreviewLayer'? Mylić, bo to wyraźnie daje nam błąd, jeśli oczywiście jest to uiview –

17

tutaj jest mój kod, to działa dla mnie idealny, można zwrócić się do niego

- (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

, można go również zawinąć z blokiem dispatch_async. – jianpx

+0

Dzięki temu dzieło zadziałało jak urok :-) –

+0

Czy to rzeczywiście będzie rekord? – user717452