我有一个简单的C或Objective-C程序,可以使用AVFoundation框架在MacOS上打印所有连接的视频设备。 当我断开连接或连接新的视频捕获设备列表时,直到我停止程序并再次运行它才会刷新。
我的代码如下:
#import <AVFoundation/AVFoundation.h>
#include <stdio.h>
void print_devices() {
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *device in devices) {
const char *name = [[device localizedName] UTF8String];
fprintf(stderr, "Device: %s\n", name);
}
}
int main() {
print_devices();
sleep(10);
// I connect or disconnect new capture device here via USB
print_devices();
// second print_devices(); displays exact same devices
// as first call to this function.
return 0;
}
我的实际程序看起来有点不同,我从Go程序调用代码,但这是最小的再现代码,看看问题出在哪里。 我总是打印相同的设备,直到我停止程序并再次启动它,然后正确检测到新设备。
捕获的地方或我在这里失踪了什么?
答案 0 :(得分:1)
您需要运行一个事件循环。
最有可能的是,AVFoundation仅更新其设备列表以响应事件。你在这个应用程序中调用sleep()。在睡觉时,应用程序不会收到通知。因此,sleep()之前和之后的devices数组将是相同的。
如果您正在使用Apple的Foundation / AppKit / UIKit框架,则需要以Apple的方式编写程序。这意味着使用运行循环和计时器,而不是sleep();