在Microsoft Media Foundation中获取相机支持的所有FPS值

我想获得我的摄像头支持的所有FPS值的列表。

在如何设置video捕捉帧率的 MSDN文章说,我可以查询系统的最大和最小支持特定相机的FPS。

它还说:

该设备可能支持此范围内的其他帧速率。

并在MF_MT_FRAME_RATE_RANGE_MIN中说:

该设备不保证在此范围内支持每个增量。

所以听起来好像没有办法让媒体基金会的相机支持所有的FPS值,只有最大值和最小值。

我知道在Linux上v4l2-ctl --list-formats-ext命令打印的支持的FPS不仅仅是min和max。

以下是使用不同摄像头的Linux的几个例子:

 $ v4l2-ctl --list-formats-ext ioctl: VIDIOC_ENUM_FMT Index : 0 Type : Video Capture Pixel Format: 'YUYV' Name : YUV 4:2:2 (YUYV) Size: Discrete 160x120 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.036s (27.500 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.044s (22.500 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.057s (17.500 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.080s (12.500 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.133s (7.500 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 176x144 Interval: Discrete 0.033s (30.000 fps) ... 

 $ v4l2-ctl --list-formats-ext ioctl: VIDIOC_ENUM_FMT Index : 0 Type : Video Capture Pixel Format: 'YUYV' Name : YUV 4:2:2 (YUYV) Size: Discrete 640x360 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 640x480 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 320x240 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 160x120 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 960x544 Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 1280x720 Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) 

 $ v4l2-ctl --list-formats-ext ioctl: VIDIOC_ENUM_FMT Index : 0 Type : Video Capture Pixel Format: 'YUYV' Name : YUV 4:2:2 (YUYV) Size: Discrete 1280x720 Interval: Discrete 0.111s (9.000 fps) Size: Discrete 160x120 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 320x240 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 1280x800 Interval: Discrete 0.111s (9.000 fps) Size: Discrete 640x480 Interval: Discrete 0.033s (30.000 fps) Index : 1 Type : Video Capture Pixel Format: 'MJPG' (compressed) Name : MJPEG Size: Discrete 1280x720 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 160x120 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 320x240 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 1280x800 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 640x480 Interval: Discrete 0.033s (30.000 fps) 

那么,有没有办法通过微软媒体基金会的相机来获得所有支持的FPS呢,还是在这个方面确实有限呢?

Solutions Collecting From Web of "在Microsoft Media Foundation中获取相机支持的所有FPS值"

帧速率和其他属性可以用类似于下面的代码来检索(为简洁起见省略了错误检查):

 Microsoft::WRL::ComPtr<IMFSourceReader> reader = nullptr; /* reader code omitted */ IMFMediaType* mediaType = nullptr; GUID subtype { 0 }; UINT32 frameRate = 0; UINT32 frameRateMin = 0; UINT32 frameRateMax = 0; UINT32 denominator = 0; DWORD32 width, height; DWORD index = 0; HRESULT hr = S_OK; while (hr == S_OK) { hr = reader->GetNativeMediaType((DWORD) MF_SOURCE_READER_FIRST_VIDEO_STREAM, index, &mediaType); if (hr == MF_E_NO_MORE_TYPES) break; hr = mediaType->GetGUID(MF_MT_SUBTYPE, &subtype); hr = MFGetAttributeSize(mediaType, MF_MT_FRAME_SIZE, &width, &height); hr = MFGetAttributeRatio(mediaType, MF_MT_FRAME_RATE, &frameRate, &denominator); hr = MFGetAttributeRatio(mediaType, MF_MT_FRAME_RATE_RANGE_MIN, &frameRateMin, &denominator); hr = MFGetAttributeRatio(mediaType, MF_MT_FRAME_RATE_RANGE_MAX, &frameRateMax, &denominator); ++index; } 

帧速率以比率表示。 属性值的高32位包含分子,低32位包含分母。 例如,如果帧速率是每秒30帧(fps),则比率是30/1。 如果帧率是29.97fps,则比率是30,000 / 1001。

一般来说,分母将是1(我没有看到它是别的)。 和我测试的各种摄像头,frameRate,frameRateMin和frameRateMax是相同的数字。 结果看起来几乎与上面列出的相同。

编辑:

例如,以下是上面的代码(减去printf)输出到Logitech Webcam Pro 9000所支持的本地格式的控制台输出:

在这里输入图像说明

这个老的摄像头有46个原生格式,而新的摄像头有更多(C930e有216)。 以下是C930e的前81种原生格式:

在这里输入图像说明

有时摄像头的数量会非常大,这通常意味着帧不会被扼制,并且会尽可能快地传送,这取决于快门速度,分辨率等(为了便于阅读,我最多这个​​数字为99)。

我想你是挂在下面的报价:

该设备可能支持此范围内的其他帧速率

但是,如果最小和最大不等于帧率,我还没有看到这些数字有所不同的摄像头。 请记住,这可以用于任何捕捉设备。 一个4通道PCIe采集卡具有几乎任何你想要的带宽,所以他们会选择相应的驱动程序(几种格式之间的最小和最大的差异)。