Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c AVCaptureDevice的USB接口_Objective C_C_Macos_Avfoundation_Iokit - Fatal编程技术网

Objective c AVCaptureDevice的USB接口

Objective c AVCaptureDevice的USB接口,objective-c,c,macos,avfoundation,iokit,Objective C,C,Macos,Avfoundation,Iokit,如果我有AVCaptureDevice,如何获得相关的USB接口,以便通过IOKit访问底层硬件 我试着通过vid&pid找到它,但是如果我用相同的vid&pid插入两个设备,这将不起作用。下面是我用来从AVCaptureDevice提取vid和pid的代码: AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithDeviceType:AVMediaTypeVideo]; NSString *modelID = [device m

如果我有AVCaptureDevice,如何获得相关的USB接口,以便通过IOKit访问底层硬件

我试着通过vid&pid找到它,但是如果我用相同的vid&pid插入两个设备,这将不起作用。下面是我用来从AVCaptureDevice提取vid和pid的代码:

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithDeviceType:AVMediaTypeVideo];
NSString *modelID = [device modelID];

NSRange vidRange = [modelID rangeOfString:@"VendorID_"];
int vid = [[modelID substringWithRange:NSMakeRange(vidRange.location + 9, 5)] intValue];

NSRange pidRange = [modelID rangeOfString:@"ProductID_"];
int vid = [[modelID substringWithRange:NSMakeRange(pidRange.location + 10, 5)] intValue];
然后我搜索匹配的IOService:

CFMutableDictionaryRef matchingDict = IOServiceMatching(kIOUSBDeviceClassName);
CFNumberRef numberRef;

numberRef = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &vid);
CFDictionarySetValue(matchingDict, CFSTR(kUSBVendorID), numberRef);
CFRelease(numberRef);

numberRef = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &pid);
CFDictionarySetValue(matchingDict, CFSTR(kUSBProductID), numberRef);
CFRelease(numberRef);

io_service_t camera = IOServiceGetMatchingService(kIOMasterPortDefault, matchingDict);

也许
AVCaptureDevice
modelID
uniqueID
的组合可以帮助您找到匹配的
IOService
。这两个ID的格式看起来都是未记录的,并且依赖于传输和媒体类型,但是您应该能够找到一些解决方法。以下是基于两个设备的USB音频的暂定映射(因为我没有任何USB摄像头):

modelID: USB Headphone Set:0C76:1607
uniqueID: AppleUSBAudioEngine:Unknown Manufacturer:USB Headphone Set:14200000:2,1,
    USB Headphone Set:

    Product ID: 0x1607
    Vendor ID:  0x0c76  (Solid State System Co., Ltd.)
Version:    1.00
Speed:  Up to 12 Mb/sec
    Location ID:    0x14200000 / 9
    Current Available (mA): 1000
    Current Required (mA):  100
    Extra Operating Current (mA):   0


uniqueID: AppleUSBAudioEngine:Burr-Brown from TI              :USB Audio CODEC :14200000:2,
modelID: USB Audio CODEC :08BB:2902
    USB Audio CODEC :

    Product ID: 0x2902
    Vendor ID:  0x08bb  (Texas Instruments Japan)
Version:    1.00
Speed:  Up to 12 Mb/sec
Manufacturer:   Burr-Brown from TI
    Location ID:    0x14200000 / 10
    Current Available (mA): 1000
    Current Required (mA):  100
    Extra Operating Current (mA):   0
(usb音频)格式类似于

modelID: name:vendorID:productID
uniqueID: AppleUSBAudioEngine:Manufacturer or Unknown Manufacturer:location ID:???
如果USB视频的
uniqueID
类似,那么
productID
vendorID
locationID
(哪个USB端口)的组合应该足以唯一地识别底层设备的硬件,尽管是以脆弱且未记录的方式