我想获得我的网络摄像头支持的所有 FPS 值的列表。
在 How to Set the Video Capture Frame Rate msdn 文章中,它说我可以查询系统以获取特定相机支持的最大和最小 FPS。
它还说:
在 MF_MT_FRAME_RATE_RANGE_MIN 中它说:
因此,听起来似乎没有办法通过 Media Foundation 中的相机获得 支持的所有 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)
那么,有没有办法通过 Microsoft Media Foundation 中的相机获取所有支持的 FPS,或者在这方面确实受到限制?
最佳答案
可以使用类似于以下的代码检索帧速率和其他属性(为简洁起见,省略了错误检查):
Microsoft::WRL::ComPtr<IMFSourceReader> reader = nullptr;
/* reader code omitted */
IMFMediaType* mediaType = nullptr;
GUID subtype { 0 };
UINT32 frameRate = 0u;
UINT32 frameRateMin = 0u;
UINT32 frameRateMax = 0u;
UINT32 denominator = 0u;
DWORD index = 0u;
DWORD width = 0u;
DWORD height = 0u;
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;
// Error checking omitted for brevity
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;
}
通常,分母将为 1(我还没有看到它是其他任何东西)。对于我测试过的各种网络摄像头,frameRate、frameRateMin 和 frameRateMax 是相同的数字。结果看起来与您在上面列出的几乎相同。
编辑:
例如,以下是将上述代码(减去 printf)输出到 Logitech Webcam Pro 9000 支持的 native 格式的控制台输出:
这个较旧的网络摄像头有 46 种原生格式,而较新的网络摄像头有更多(C930e 有 216 种)。以下是 C930e 的前 81 种原生格式:
有时网络摄像头的数字非常高,这通常意味着帧不会受到限制,并且会尽快传送,这取决于快门速度、分辨率等(为了便于阅读,我将此数字最大为 99)。
我认为您对以下报价很感兴趣:
然而,如果最小值和最大值不等于帧速率,我还没有看到这些数字不同的网络摄像头。请记住,这可以与任何捕获设备一起使用。 4 channel PCIe 采集卡的带宽几乎可以跟上您想要的任何内容,因此他们会选择相应地编写驱动程序(少数格式在最小值和最大值之间存在较大差异)。
关于c++ - 在 Microsoft Media Foundation 中获取所有支持的相机 FPS 值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30815015/