標籤:
寫在前面
我是個講文明的人…… 不過有的時候實在忍不住了也要吐槽幾句:
1. 我真是跟不上時代,到現在了還在研究 Windows 應用開發…… 咳;
2. DirectShow 是傻X!我只是想要擷取 Camera 裸資料,尼瑪卻要讓我學習神馬各種 .ax, filter, graph... 相關資料少、又晦澀;
3. 在此祝願 Windows XP 及其之前的版本早點退出曆史舞台,這樣 DirectShow 就不是必須的了!
音視頻採集Windows 7 以後, Media Foundation 支援音視頻採集。視頻採集裝置必須支援 UVC 1.1 驅動。
音頻採集裝置通過 Windows Audio Session API (WASAPI) 來支援。採集裝置在 Media Foundation 中表現為 Media Source 對象,暴露出 IMFMediaSource 介面。但是一般情況下應用程式不會直接用這個介面,而會使用更高層的API,比如 Source Reader 來控制採集裝置。枚舉採集裝置們:1 調用 MFCreateAttributes 函數建立屬性庫;2 設定 MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE 屬性(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID 或 MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID);3 調用 MFEnumDeviceSources 函數就會得到一群組 IMFActivate 指標。每個指標就是一個裝置;4 調用 GetAllocatedString 函數 可以擷取裝置名稱,其中,4.1 用 GetAllocatedString 函數 的 MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME 參數可以擷取顯示名稱4.2 用 GetAllocatedString 函數 的 MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK 參數可以擷取視頻採集裝置的實體名稱,名稱是唯一的,但不好閱讀4.3 用 GetAllocatedString 函數 的 MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_ENDPOINT_ID 參數可以擷取音頻採集裝置的實體名稱,名稱是唯一的,但不好閱讀5 調用 IMFActivate::ActivateObject 或 MFCreateDeviceSource 方法來建立一個可用的 Media Source 對象執行個體。對於具體的一個採集裝置(建立好了的 Media Source),擷取裝置所支援的格式,並設定採集格式:1 調用 IMFMediaSource::CreatePresentationDescriptor 擷取媒體源(Media Source)的表現描述符(presentation descriptor)2 調用 IMFPresentationDescriptor::GetStreamDescriptorByIndex 擷取視頻流的流描述符(Stream Descriptor)3 調用 IMFStreamDescriptor::GetMediaTypeHandler 擷取流描述符的媒體類型控制代碼(IMFMediaTypeHandler)4 調用 IMFMediaTypeHandler:: 的 GetMediaTypeCount 和 GetMediaTypeByIndex 來擷取每一條目的格式(IMFMediaType,每一條目的格式包含許多屬性,如寬高、採樣格式、幀率),另外,教程還有一些實用函數,用於列印 IMFAttributes 。5 最後, IMFMediaTypeHandler::SetCurrentMediaType 設定指定條目的格式(IMFMediaType)。如果要修改 IMFMediaType 的某個屬性(比如 Frame Rate)的話,就調用 IMFMediaType::SetItem 來設定具體的屬性(比如 MF_MT_FRAME_RATE)。具體要看代碼來理解。
相關文檔:
https://msdn.microsoft.com/en-us/library/dd317912.aspxhttps://msdn.microsoft.com/en-us/library/dd940326.aspxhttps://msdn.microsoft.com/en-us/library/dd940328.aspx (裝置使用時中途丟失的處理,待學)https://msdn.microsoft.com/en-us/library/ee663602.aspxhttps://msdn.microsoft.com/en-us/library/aa473818.aspx (媒體類型)
其他功能
視頻採集並顯示(MFCaptureD3D): https://msdn.microsoft.com/en-us/library/dd743690.aspx
音視頻採集 + 編碼(Transcode): https://msdn.microsoft.com/en-us/library/ff485863.aspx
播放媒體檔案:https://msdn.microsoft.com/en-us/library/ms703190.aspx
代碼地址
在 Windows SDK 的 Samples\multimedia\mediafoundation 目錄中
Windows Media Foundation 音視頻採集 小記