2016-05-26 8 views
0

Ich habe einen Beispielcode von AVFoundation gefunden, der in Swift geschrieben ist. Ich habe versucht, den Code in Objective-C zu ändern. Aber ich bin mir nicht sicher, ob ich das richtig gemacht habe, weil der Code im Moment nicht funktioniert. Könnten Sie bitte einen Blick darauf werfen?AVFoundation swift Code nach Objective-C

func initialiseCaptureSession() 
{ 
    captureSession.sessionPreset = AVCaptureSessionPresetPhoto 

    guard let frontCamera = (AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) as! [AVCaptureDevice]) 
     .filter({ $0.position == .Front }) 
     .first else 
    { 
     fatalError("Unable to access front camera") 
    } 

    do 
    { 
     let input = try AVCaptureDeviceInput(device: frontCamera) 

     captureSession.addInput(input) 
    } 
    catch 
    { 
     fatalError("Unable to access front camera") 
    } 

    let videoOutput = AVCaptureVideoDataOutput() 

    videoOutput.setSampleBufferDelegate(self, queue: dispatch_queue_create("sample buffer delegate", DISPATCH_QUEUE_SERIAL)) 
    if captureSession.canAddOutput(videoOutput) 
    { 
     captureSession.addOutput(videoOutput) 
    } 

    captureSession.startRunning() 
} 

Mein Objective-C-Code:

-(void)initializeCaptureSession { 

self.captureSession.sessionPreset = AVCaptureSessionPresetPhoto; 

AVCaptureDevice *inputDevice = nil; 

NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; 
AVCaptureDeviceInput *deviceInput; 

for(AVCaptureDevice *camera in devices) { 

    if([camera position] == AVCaptureDevicePositionFront) { // is front camera 
     inputDevice = camera; 
     deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:nil]; 
     [self.captureSession addInput:deviceInput]; 
     break; 
    } 
} 
AVCaptureVideoDataOutput *videoOutput = nil; 
[videoOutput setSampleBufferDelegate:self queue:dispatch_queue_create("sample buffer delegate", DISPATCH_QUEUE_SERIAL)]; 
if([self.captureSession canAddOutput:videoOutput]) { 
    [self.captureSession addOutput:videoOutput]; 
} 
[self.captureSession startRunning]; 

}

Das Problem ist, dass in meinem Fall

if([self.captureSession canAddOutput:videoOutput]) { [self.captureSession addOutput:videoOutput]; }

wird ignoriert. Ich bin mir nicht sicher, aber ist etwas falsch mit meinem self.captureSession addInput: deviceInput];?

Mit freundlichen Grüßen, Nazar

Antwort

1

Es gibt ein Problem mit dieser Linie

AVCaptureVideoDataOutput *videoOutput = nil; 

Die AVCaptureVideoDataOutput nicht initialisiert und daher canAddOutput:videoOutput ausfällt.

Sie können es so initialisieren;

videoOutput = [[AVCaptureVideoDataOutput alloc] init]; 
+0

Dank bro. Das hat funktioniert! Ich habe auch versucht, zu initialisieren ** AVCaptureDevice * inputDevice = nil; ** mit ** AVCaptureDevice * inputDevice = [[AVCaptureDevice alloc] init]; ** aber dies verursachte eine Ausnahme. Muss ich das auch initialisieren? –