3

我正在开发一个列出连接到系统的网络摄像头的桌面应用程序。当用户选择从设备到 QTCaptureView 的网络摄像头应用程序流时。我已注册到通知QTCaptureDeviceWasDisconnectedNotificationQTCaptureDeviceWasConnectedNotification因此只要设备断开连接并连接,我就会删除该设备并将其添加到列表中。

问题是QTCaptureDeviceWasConnectedNotification在连接设备时发布了两次。这是什么原因?

此外,在我的一台 Mac Book 中,我经常遇到以下问题。从 QTCaptureDeviceWasConnectedNotification 第二个通知(我收到两个通知)获得的设备没有本地化描述名称。你能告诉我这里可能出了什么问题吗?

4

2 回答 2

1

我有同样的问题。就我而言,这种有趣行为的原因是带有内置麦克风的网络摄像头。因此,当连接此类多功能设备时,将有两个通知 - 一个用于视频捕获设备,第二个用于内置麦克风。

这是阻止我了解情况的一般错误列表(可能会对您有所帮助):

  • 曾使用内置麦克风的网络摄像头
  • 使用 [QTCaptureDevice inputDevicesWithMediaType:] 而不是 [QTCaptureDevice inputDevices]。这使我无法看到连接的其他类型的设备(例如麦克风)
  • 在我的测试中,当没有“视频”设备时,我什么也没记录。这就是我看到两个连接的通知(视频、视频+麦克风)和只有一个断开连接的通知(-mic、-video)的原因——起初这让我很困惑。

这是我测试的日志。

在设备上附加第一个通知是:

Device++ #0: "AppleHDAEngineInput:1B,0,1,1:4" - "AppleHDA:12"
Device++ #1: "AppleHDAEngineInput:1B,0,1,0:3" - "AppleHDA:12"
Device++ #2: "0xfd100000046d0990" - "UVC Camera VendorID_1133 ProductID_2448"

你可以单独看到UVC相机。第二个通知是:

Device++ #0: "AppleHDAEngineInput:1B,0,1,1:4" - "AppleHDA:12"
Device++ #1: "AppleUSBAudioEngine:Unknown Manufacturer:Logitech Camera:5895DC4F:3" - "AppleUSBAudioDevice:Logitech Camera"
Device++ #2: "AppleHDAEngineInput:1B,0,1,0:3" - "AppleHDA:12"
Device++ #3: "0xfd100000046d0990" - "UVC Camera VendorID_1133 ProductID_2448"

您可以看到 UVC 摄像头和 AppleUSBAudioEngine - 麦克风。

在设备分离时也会有两个通知。第一:

Device-- #0: "AppleHDAEngineInput:1B,0,1,1:4" - "AppleHDA:12"
Device-- #1: "AppleHDAEngineInput:1B,0,1,0:3" - "AppleHDA:12"
Device-- #2: "0xfd100000046d0990" - "UVC Camera VendorID_1133 ProductID_2448"

没有麦克风,UVC 摄像头还在。第二次通知:

Device-- #0: "AppleHDAEngineInput:1B,0,1,1:4" - "AppleHDA:12"
Device-- #1: "AppleHDAEngineInput:1B,0,1,0:3" - "AppleHDA:12"

没有 UVC 摄像头,没有麦克风。

此外,QTKit 可能可以“合并”通知,因为有时我只收到一个通知(一个用于连接,一个用于断开连接),因此实际通知数量不仅取决于连接或断开连接的(子)设备的数量。

对于localizedDisplayName - 还没有问题。

于 2011-02-14T17:57:13.080 回答
1

我有同样的问题,所以我做了一些挖掘,确实它似乎与包含音频和视频的设备有关。

因此,我试图确定该条目是音频条目还是视频条目,这是我发现的:

NSArray *inputDevices = [QTCaptureDevice inputDevices]; 
for(QTCaptureDevice *listDevice in inputDevices) {
    NSLog(@"%@",[[[device formatDescriptions] objectAtIndex:0] mediaType]);
}

以上输出“vide”或“soun”,它们是 QTMediaTypeVideo 和 QTMediaTypeSound 的值。因此,如果您只想使用视频设备,可以检查上述值是否为 QTMediaTypeVideo。

不确定它是否对您的问题有帮助。

于 2011-06-13T08:49:21.843 回答