How to get a list of video capture devices (web cameras) on linux ( ubuntu )? (C/C++)
This is a code snippet I had laying around. Probably from a book. I guess you could just iterate over all /dev/videoN nodes and get the info.
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/videodev.h>
int main(){
int fd;
struct video_capability video_cap;
struct video_window video_win;
struct video_picture video_pic;
if((fd = open("/dev/video0", O_RDONLY)) == -1){
perror("cam_info: Can't open device");
return 1;
}
if(ioctl(fd, VIDIOCGCAP, &video_cap) == -1)
perror("cam_info: Can't get capabilities");
else {
printf("Name:\t\t '%s'\n", video_cap.name);
printf("Minimum size:\t%d x %d\n", video_cap.minwidth, video_cap.minheight);
printf("Maximum size:\t%d x %d\n", video_cap.maxwidth, video_cap.maxheight);
}
if(ioctl(fd, VIDIOCGWIN, &video_win) == -1)
perror("cam_info: Can't get window information");
else
printf("Current size:\t%d x %d\n", video_win.width, video_win.height);
if(ioctl(fd, VIDIOCGPICT, &video_pic) == -1)
perror("cam_info: Can't get picture information");
else
printf("Current depth:\t%d\n", video_pic.depth);
close(fd);
return 0;
}
How to get a list video capture devices NAMES (web cameras) on linux ( ubuntu )? (C/C++)
You are using the V4L1 API which is deprecated - V4L2 is the preferred API for new code.
In any case, the VIDIOC_QUERYCAP
ioctl()
is probably what you are looking for. You will want to have a look at the .card
field of the returned struct v4l2_capability
structure.
EDIT:
You could have a look at the source code for the v4l-info
utility, which does exactly what you want.
How to get a list of video capture devices (web cameras) on windows? (C++)
From the examples shown, copy the following code into dev.c. Then open the command line with all the SDK variables set. At the command line link to ole32.lib and oleaut32.lib. It will then show you all the devices.
cl dev.c ole32.lib oleaut32.lib
dev.exe will give out the list on the command line.
#include <windows.h>
#include <dshow.h>
#pragma comment(lib, "strmiids")
HRESULT EnumerateDevices(REFGUID category, IEnumMoniker **ppEnum)
{
// Create the System Device Enumerator.
ICreateDevEnum *pDevEnum;
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum));
if (SUCCEEDED(hr))
{
// Create an enumerator for the category.
hr = pDevEnum->CreateClassEnumerator(category, ppEnum, 0);
if (hr == S_FALSE)
{
hr = VFW_E_NOT_FOUND; // The category is empty. Treat as an error.
}
pDevEnum->Release();
}
return hr;
}
void DisplayDeviceInformation(IEnumMoniker *pEnum)
{
IMoniker *pMoniker = NULL;
while (pEnum->Next(1, &pMoniker, NULL) == S_OK)
{
IPropertyBag *pPropBag;
HRESULT hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag));
if (FAILED(hr))
{
pMoniker->Release();
continue;
}
VARIANT var;
VariantInit(&var);
// Get description or friendly name.
hr = pPropBag->Read(L"Description", &var, 0);
if (FAILED(hr))
{
hr = pPropBag->Read(L"FriendlyName", &var, 0);
}
if (SUCCEEDED(hr))
{
printf("%S\n", var.bstrVal);
VariantClear(&var);
}
hr = pPropBag->Write(L"FriendlyName", &var);
// WaveInID applies only to audio capture devices.
hr = pPropBag->Read(L"WaveInID", &var, 0);
if (SUCCEEDED(hr))
{
printf("WaveIn ID: %d\n", var.lVal);
VariantClear(&var);
}
hr = pPropBag->Read(L"DevicePath", &var, 0);
if (SUCCEEDED(hr))
{
// The device path is not intended for display.
printf("Device path: %S\n", var.bstrVal);
VariantClear(&var);
}
pPropBag->Release();
pMoniker->Release();
}
}
void main()
{
HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (SUCCEEDED(hr))
{
IEnumMoniker *pEnum;
hr = EnumerateDevices(CLSID_VideoInputDeviceCategory, &pEnum);
if (SUCCEEDED(hr))
{
DisplayDeviceInformation(pEnum);
pEnum->Release();
}
hr = EnumerateDevices(CLSID_AudioInputDeviceCategory, &pEnum);
if (SUCCEEDED(hr))
{
DisplayDeviceInformation(pEnum);
pEnum->Release();
}
CoUninitialize();
}
}
Maemo 5 Qt: how to capture frame (RGB) from first and second camera?
Install Qt Mobility QtMultiMediaKit extension (libqtm-multimedia-dev
package) and then use QCamera
in conjunction with QCameraImageCapture
to capture frames. To activate the front-facing secondary camera, construct your camera like this:
QCamera *camera = new QCamera(QCamera::availableDevices()[1]);
Related Topics
Advantages of Using Arrays Instead of Std::Vector
Visual Studio Compiler Warning C4250 ('Class1':Inherits 'Class2::Member' via Dominance)
Why Derive from a Concrete Class Is a Poor Design
G++ Ld: Symbol(S) Not Found for Architecture X86_64
Can a Lambda Capturing Nothing Access Global Variables
Is Gcc Considering Builtins of Non-Constant Expression Functions to Be Constant Expressions
Register an Object Creator in Object Factory
What Is the Rule That Allows 'This->' to Access Members of Dependent Base Classes
Objects of Different Classes in a Single Vector
Can You Make a Computed Goto in C++
Why Do My Sfinae Expressions No Longer Work with Gcc 8.2
a Few Things About Division by Zero in C
Rotating a 2D Pixel Array by 90 Degrees
Should Function Declarations Include Parameter Names
Why Is Std::For_Each a Non-Modifying Sequence Operation
C++ Cmake (Add Non-Built Files)
How to Stop Windows from Blocking the Program During a Window Drag or Menu Button Being Held Down