2015-02-04 3 views
0

XPC 서비스 내에서 AVFoundation 및 OpenCV를 사용할 수 있습니까? 나는 그런 간단한 코드를 가지고XPC 서비스 및 AVFoundation

#include <opencv2/opencv.hpp> 
#import <AVFoundation/AVFoundation.h> 

@interface AppDelegate(){ 
    cv::VideoCapture m_vidCap; 
} 

...

일반 코코아 응용 프로그램 내에서 시작할 때 필요에 따라 작동
//Hacky way of forcing OpenCV to call AVFoundation for the first time 
    //before the camera arrives 
    //OpenCV should add a better way of mapping camera indexes to cameras 
    //This way we force that devices are enumerated in the same order here 
    //and in their code 
    m_vidCap.open(-1); 
    m_vidCap.release(); 
[AVCaptureDevice devices]; //Force avfoundation "startup" 
@autoreleasepool { 
    std::vector<std::wstring> devices; 
    // chosen device. 
    NSArray *osDevices=[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; 
    NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding (kCFStringEncodingUTF32LE); 
    AVCaptureDevice *device; 
    int did=0; 
    for(device in osDevices) { 
     NSString *deviceName=[device localizedName]; 
     NSData* wstrdata = [deviceName dataUsingEncoding : encoding ]; 
     std::wstring cppDeviceName=std::wstring((wchar_t*) [ wstrdata bytes ], [ wstrdata length]/sizeof (wchar_t)); 
     devices.push_back(cppDeviceName); 
     //NSLog("Device %d: %S at position %ld",did,cppDeviceName.c_str(),device.position); 
     did++; 
    } 
} 

. 그것은 모두 카메라, FaceTime 하나와 USB 하나를 열거합니다.

나는

m_vidCap.open(-1); 

에서 영원히 중단됩니다 추가 실행되지 않습니다 내 XPC 서비스 내에서 똑같은 코드를 삽입합니다.

XPC 서비스 내에서 사용할 수있는 것에 대한 제한이 있다고 가정하고 있지만 Google에서 유용하지는 않습니다. 모든 의견을 보내 주시면 감사하겠습니다. Thx

답변

0

글쎄, 많은 시도와 애플에서 샘플을 검사 한 후에 나는 그것을 작동 시켰습니다. 문제는 NSXPCListener이 어떻게 생성되는지입니다. 나는 작동하지 않은 일반 서비스

NSXPCListener *listener = [NSXPCListener serviceListener]; 

처럼되기 전에. 내가

로 변경 한 후

ToolMonitorDelegate *myDelegate = [[ToolMonitorDelegate alloc] initWithHardwareType:HT_Vision]; 
NSXPCListener *listener = [[NSXPCListener alloc] initWithMachServiceName:bundleId]; 

listener.delegate = myDelegate; 
[listener resume]; 

[[NSRunLoop currentRunLoop] run]; 

모든 것을 즉시했다. OpenCV가 제대로 작동하려면 앱 루프를 실행해야하는 것처럼 보입니다. 내가 틀렸거나 또 다른 설명이 있으면 저를 바로 잡으십시오.

+0

LaunchAgent 또는 LaunchDaemon을 사용하고 있습니까? 당신의 접근 방식을 사용하여 표준 XPCService에서 유사한 문제를 해결했지만 Xcode에서 실행될 때만 작동합니다. Xcode 외부에서 응용 프로그램을 시작하면 서비스에 연결하지 못하는 것 같습니다. –

+0

마지막에 XPC 서비스와 OpenCV를 사용하여 모든 것이 매우 불안정하고 많은 예외가 발생했습니다. 모든 OpenCV 코드를 기본 응용 프로그램으로 옮긴 후 모두 완벽하게 작동했습니다. – Eugen

1

거의 다 왔어! AVFoundation은 NSRunLoop을 사용해야하지만 XPC 서비스는 기본적으로 dispatch_main을 사용합니다. XPC 서비스의 info.plist 파일에있는 XPCService 키로 식별되는 사전 값에 키를 추가해야합니다. 기본적으로 하나의 ServiceType 키가 있어야합니다. RunLoopType 키를 추가하고 문자열 값을 NSRunLoop으로 지정하십시오.

자세한 내용은 Creating XPC services을 참조하십시오.

관련 문제