2015-06-13 52 views
4

我想獲取我的網絡攝像頭支持的所有FPS值的列表。獲取Microsoft Media Foundation中相機的所有支持的FPS值

How to Set the Video Capture Frame Rate msdn文章它說,我可以查詢系統的最大和最小支持特定相機的FPS。

它還說:

設備可能在此範圍內支持其他的幀速率。

而且在MF_MT_FRAME_RATE_RANGE_MIN它說:

該設備不保證支持此範圍內每遞增。

所以,它聽起來就像是沒有辦法通過相機在媒體基金會,只是最大值和最小值,以獲得支持的FPS值所有

我知道,在Linux v4l2-ctl --list-formats-ext命令打印更多的支持FPS不只是最小和最大。使用不同的相機從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,還是在這方面受到限制?

回答

3

的幀速率和其他屬性可以與類似於以下代碼來檢索(錯誤檢查爲簡潔起見省略):

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位包含分母 。例如,如果幀速率爲每秒012幀(fps)30幀,則該比率爲30/1。如果幀頻爲29.97 fps,則 比率爲30,000/1001。

一般來說,分母將是1(我沒有看到它是別的)。而且,我測試過的各種網絡攝像頭,frameRate,frameRateMin和frameRateMax都是相同的數字。結果看起來幾乎與上面列出的相同。

編輯:

例如,以下是上面的代碼的輸出(減去的printf)至本機格式控制檯輸出所支持用於一個Logitech網絡攝像頭臨9000:

enter image description here

這個較舊的網絡攝像頭有46種原生格式,而較新的網絡攝像頭有更多(C930e有216個)。下面是C930e的第81種機格式:

enter image description here

有時,一個攝像頭都會有非常高的數字,這通常意味着幀將不被儘可能快地節流,交付,它依賴在快門速度,分辨率等(我最大這個數字爲99爲了可讀性)。

我覺得你越來越掛在下面的話:

設備可能支持這個範圍的

內的其他幀速率但是那就是如果最小值和最大值不等於幀率,我還沒有看到這些數字有所不同的網絡攝像頭。請記住,這可以用於任何捕捉設備。一個4通道PCIe採集卡具有幾乎任何你想要的帶寬,所以他們會選擇相應地編寫驅動程序(幾種格式之間的最小和最大差異)。

+0

請仔細閱讀該問題,並在回答之前嘗試理解其中的含義。 –

+0

如果你在幾臺攝像機上試過上面的代碼,你不會發表評論。我會編輯答案過於明確。 – Jeff

+0

如果您閱讀我的問題,您會看到我想爲相機獲取** ALL **有效的FPS值,而不僅僅是MF_MT_FRAME_RATE,MF_MT_FRAME_RATE_RANGE_MIN和MF_MT_FRAME_RATE_RANGE_MAX。你的答案對我來說毫無用處,因爲它只有'MF_MT_FRAME_RATE','MF_MT_FRAME_RATE_RANGE_MIN'和'MF_MT_FRAME_RATE_RANGE_MAX',我已經知道如何獲得。 –

相關問題