2016-05-26 2 views
0

Я нашел пример кода AVFoundation, который написан в Swift. Я попытался изменить код на Objective-C. Но я не уверен, правильно ли я сделал это, потому что в настоящий момент код не работает. Не могли бы вы посмотреть на это, пожалуйста?AVFoundation change Swift для 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() 
} 

Мой код Objective-C:

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

}

Проблема заключается в том, что в моем случае

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

игнорируется. Я не уверен, но что-то не так с моим self.captureSession addInput: deviceInput];?

С наилучшими пожеланиями, Назар

ответ

1

Существует проблема с этой линией

AVCaptureVideoDataOutput *videoOutput = nil; 

AVCaptureVideoDataOutput не инициированная и, следовательно, не может canAddOutput:videoOutput.

Вы можете инициализировать его следующим образом;

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

Спасибо, брат. Это сработало! Я также пытался инициализировать ** AVCaptureDevice * inputDevice = nil; ** с ** AVCaptureDevice * inputDevice = [[AVCaptureDevice alloc] init]; **, но это вызвало исключение. Должен ли я также инициализировать это? –

Смежные вопросы