2

幾天前,我想試試Media Foundation神祕的MFSourceFilter

我注意到的第一件事是不播放MPEG2文件(至少在Windows 7上不播放),但是,Windows Media Player 12卻沒有。因此,我跑了mftrace wmplayer.exe並檢查了輸出。

9052,2BF4 14:06:36.00364 COle32ExportDetours::CoCreateInstance @ Created {14D7A407-396B-44B3-BE85-5199A0F0F80A} Media Foundation DShow Source Resolver (C:\Windows\SysWOW64\mfds.dll) @0984E950 - traced interfaces: 
9052,1BEC 14:06:36.00450 COle32ExportDetours::CoCreateInstance @ Created {CDA42200-BD88-11D0-BD4E-00A0C911CE86} Filter Mapper2 (C:\Windows\SysWOW64\quartz.dll) @0821B894 - traced interfaces: 
9052,2BF4 14:06:36.00723 COle32ExportDetours::CoCreateInstance @ Created {E436EBB3-524F-11CE-9F53-0020AF0BA770} Filter Graph (C:\Windows\SysWOW64\quartz.dll) @081C7DD0 - traced interfaces: IGraphBuilder @081C7DD0, IMediaControl @04E6D66C, 
9052,2BF4 14:06:36.00741 COle32ExportDetours::CoCreateInstance @ Created {0344EC28-5339-4124-A186-2E8EEF168785} MFSourceFilter (C:\Windows\SysWOW64\mfds.dll) @09934228 - traced interfaces: 
9052,2BF4 14:06:36.00742 CMFPlatExportDetours::MFStartup @ Version=0x00020070, dwFlags=0x00000000 
9052,2BF4 14:06:36.01176 CGraphBuilderDetours::AddFilter @081C7DD0 filter: 'MF Source Filter' 
9052,2BF4 14:06:36.01194 COle32ExportDetours::CoCreateInstance @ Created {336475D0-942A-11CE-A870-00AA002FEAB5} MPEG-I Stream Splitter (C:\Windows\SysWOW64\quartz.dll) @08084574 - traced interfaces: 
9052,2BF4 14:06:36.COle32ExportDetours::CoCreateInstance @ Created {AFB6C280-2C41-11D3-8A60-0000F81E0E4A} MPEG-2 Demultiplexer (C:\Windows\SysWOW64\mpg2splt.ax) @082003E4 - traced interfaces: 
9052,2BF4 14:06:36.01328 COle32ExportDetours::CoCreateInstance @ Created {E1F1A0B8-BEEE-490D-BA7C-066C40B5E2B9} Microsoft DTV-DVD Audio Decoder (C:\Windows\SysWOW64\msmpeg2adec.dll) @0829C77C - traced interfaces: 
9052,2BF4 14:06:36.04667 COle32ExportDetours::CoCreateInstance @ Created {212690FB-83E5-4526-8FD7-74478B7939CD} Microsoft DTV-DVD Video Decoder (C:\Windows\SysWOW64\msmpeg2vdec.dll) @082C04BC - traced interfaces: 
9052,2BF4 14:06:36.04668 CGraphBuilderDetours::AddFilter @081C7DD0 filter: '' 

看起來他們似乎在創建一個使用DirectShow的Media Source。他們正在構建一個帶有MFSourceFilter的DirectShow圖形,我猜,它將解碼的音頻/視頻信息傳遞給Media Foundation。由於在網上搜索MFSourceFilter根本沒有幫助,我想知道是否有人在我開始之前和之後使用了MFSourceFilter

(我已經閱讀問題decode MPEG1/2 video with Media Foundation但它不包含什麼我要找的。)

+0

如果WMP無法通過MF,則通過DirectShow播放。 –

+0

是的,但他們仍然使用MF來播放DirectShow源代碼(通過使用該MFSourceFilter)。所以基本上,這就是我所追求的。我想知道我是否可以重用該MFSourceFilter。 –

回答

1

WMP通過DirectShow中使用媒體基礎,如果運氣不好,少走彎路。

以下是Windows 7中MPEG-2文件的示例WMP播放。Windows Media Player在內部構建了一個DirectShow圖形並採用了可用的MPEG-2解碼器。

enter image description here

這實際播放由DirectShow的完全支持,在此播放源是定期File Source (Async) Filter。 WMP可能會使用相關過濾器來獲取播放中涉及的信息(尤其是媒體類型),或者由於其內部實現的其他原因。可能甚至試圖用媒體的來源來播放,但我看到的是這個過濾器被刪除,並且常規的DirectShow播放仍然存在。

底線是Media Foundation DirectShow包裝器和源解析器存在,但它們沒有記錄,暫時由WMP使用(可能由MF透明地使用),並且不用於實際播放。因此,目前沒有重用。

我能想到的這個過濾器的一個可能的展示是構建內部DirectShow拓撲以爲MF客戶端提供元數據信息。

+0

wmplayer的mftrace輸出獲知他們使用'MFSourceFilter'而不是'Video Renderer'作爲輸出,因爲它們將解碼輸出傳遞給MF。我知道我可以自己編程,並修復未來幾年的錯誤。所以我想知道這個wmplayer的機制是否可以重用...... –

+0

您正在描述一些切換回DirectShow並將其傳回到Media Foundation來解決缺失塊的問題。我認爲這不會發生:最終WMP使用完全構建的DShow拓撲,甚至是用於EVR的DShow接口。所以WMP只是通過DShow使用其替代代碼路徑完全播放它,這是相信正在發生的事情。 –

+0

更多相關信息:WMP嘗試使用MF Source Filter構建圖形,然後清理並從新建立回放圖形。我想對於一些(而不是MPEG-2)媒體,它可以解決這個無證過濾器,但我不知道任何真實情況。 –