Как получить список устройств видеозахвата (веб-камер) на Mac OS?(C ++) - PullRequest
3 голосов
/ 26 декабря 2010

Так что все, что мне нужно, это просто - список доступных в настоящее время устройств видеозахвата (веб-камеры).Мне это нужно в простом или C ++ консольном приложении.Под списком я имею в виду что-то вроде вывода на консоль:

1) Asus Web Camera
2) Sony Web Camera

Так что это кажется простым, но у меня есть одно требование - как можно больше использовать apis для родной ОС - никаких внешних библиотек - в конце концов - все, что мы хотим, этораспечатать список - не летать на луну!) (и не используйте объектив C, пожалуйста - чистый C / C ++)

Как это сделать?


также из этой серии:

1 Ответ

4 голосов
/ 26 декабря 2010

Вам необходимо использовать SGGetChannelDeviceList, который является частью QuickTime C API. Каждое устройство может иметь несколько входов. Правильный способ разобрать это так:

    // first get a video channel from the sequence grabber

   ComponentDescription    theDesc;
   Component               sgCompID;
   ComponentResult         result;
   theDesc.componentType           = SeqGrabComponentType;
   theDesc.componentSubType        = 0L;
   theDesc.componentManufacturer   = 'appl';
   theDesc.componentFlags          = 0L;
   theDesc.componentFlagsMask      = 0L;   
   sgCompID = FindNextComponent (NULL, &theDesc);
   seqGrabber = OpenComponent (sgCompID);
   result = SGInitialize (seqGrabber);
   result = SGNewChannel (seqGrabber, VideoMediaType, &videoChannel);
   SGDeviceList  theDevices;
   SGGetChannelDeviceList(videoChannel, sgDeviceListDontCheckAvailability | sgDeviceListIncludeInputs, &theDevices);

    if (theDevices)
    {
        int theDeviceIndex;
        for (theDeviceIndex = 0; theDeviceIndex != (*theDevices)->count; ++theDeviceIndex)
        {
            SGDeviceName theDeviceEntry = (*theDevices)->entry[theDeviceIndex];
            // name of device is a pstring in theDeviceEntry.name

        SGDeviceInputList theInputs = theDeviceEntry.inputs;
            if (theInputs != NULL)
            {
                int theInputIndex;
                for ( theInputIndex = 0; theInputIndex != (*theInputs)->count; ++theInputIndex)
                {
                    SGDeviceInputName theInput = (*theInputs)->entry[theInputIndex];
                    // name of input is a pstring in theInput.name
                }
            }
        }       
    }
...