Мне нужно было делать почти то же самое, что и вы, только с непрерывным отображением видео с камеры FireWire.В моем случае я использовал библиотеку libdc1394 для выполнения захвата кадра и настройки свойств камеры для наших камер FireWire.Я знаю, что вы также можете сделать это, используя некоторые функции Carbon Quicktime, но я обнаружил, что libdc1394 немного проще для понимания.
Для цикла захвата видео я попробовал несколько разных подходов, от отдельногопоток, который опрашивает камеру и имеет блокировки вокруг общих ресурсов, чтобы использовать один NSOperationQueue для взаимодействия с камерой, и, наконец, остановился на использовании CVDisplayLink для опроса камеры способом, который соответствует частоте обновления экрана.
CVDisplayLink настраивается с использованием следующего кода:
CGDirectDisplayID displayID = CGMainDisplayID();
CVReturn error = kCVReturnSuccess;
error = CVDisplayLinkCreateWithCGDisplay(displayID, &displayLink);
if (error)
{
NSLog(@"DisplayLink created with error:%d", error);
displayLink = NULL;
}
CVDisplayLinkSetOutputCallback(displayLink, renderCallback, self);
и вызывает следующую функцию для запуска поиска нового кадра камеры:
static CVReturn renderCallback(CVDisplayLinkRef displayLink,
const CVTimeStamp *inNow,
const CVTimeStamp *inOutputTime,
CVOptionFlags flagsIn,
CVOptionFlags *flagsOut,
void *displayLinkContext)
{
return [(SPVideoView *)displayLinkContext renderTime:inOutputTime];
}
CVDisplayLink запускается и останавливаетсяиспользуя следующее:
- (void)startRequestingFrames;
{
CVDisplayLinkStart(displayLink);
}
- (void)stopRequestingFrames;
{
CVDisplayLinkStop(displayLink);
}
Вместо того, чтобы использовать блокировку связи камеры FireWire, всякий раз, когда мне нужно настроить экспозицию, усиление и т. д., я изменяю соответствующие переменные экземпляра и устанавливаю соответствующие биты в переменной флагачтобы указать, какие настройки изменить.При следующем извлечении кадра метод обратного вызова из CVDisplayLink изменяет соответствующие параметры в камере, чтобы соответствовать локально сохраненным переменным экземпляра, и сбрасывает этот флаг.
Отображение на экране обрабатывается с помощью NSOpenGLView (CAOpenGLLayerпредставил слишком много визуальных артефактов при обновлении с такой скоростью, и его обратные вызовы обновления выполнялись в основном потоке).У Apple есть несколько расширений , которые вы можете использовать для предоставления этих кадров в качестве текстур с использованием DMA для повышения производительности.
К сожалению, ничего из того, что я здесь описал, не является материалом начального уровня.У меня есть около 2000 строк кода для этих функций обработки камеры в нашем программном обеспечении, и это заняло много времени, чтобы разобраться.Если бы Apple могла добавить ручные настройки камеры в API QTKit Capture, я бы почти все это удалила.