Windows 神秘的MFSourceFilter

Windows 神秘的MFSourceFilter,windows,directshow,windows-media-player,ms-media-foundation,Windows,Directshow,Windows Media Player,Ms Media Foundation,几天前,我想试一试 我注意到的第一件事是,它不会播放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 So

几天前,我想试一试

我注意到的第一件事是,它不会播放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.01238 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的应用程序。他们正在构建一个DirectShow图,带有一个<代码> MfSuxEdter ,我猜,它正在把解码的音频/视频信息传递给MediaFoundation。因为在网上搜索
MFSourceFilter
毫无帮助,我想知道以前是否有人使用过
MFSourceFilter
,我应该从哪里开始


(我已经看过这个问题了,但它没有包含我要找的)。

WMP使用媒体基金会,如果运气不好,通过DirectShow。 下面是Windows7中MPEG-2文件的WMP播放示例。Windows Media Player在内部构建了一个DirectShow图形,并利用了现有的MPEG-2解码器

此实际播放完全由DirectShow支持,此播放的源代码是常规的。WMP可能正在使用有问题的过滤器来获取回放中涉及的信息(尤其是媒体类型),或者出于特定于其内部实现的其他原因。甚至可能尝试替换要播放的媒体源,但我看到的是,此过滤器已被删除,并且仍保留常规DirectShow播放

底线是媒体基础DirectShow包装器和源解析器存在,但它们未被记录,暂时被WMP使用(可能透明地使用MF),而不用于实际回放。因此,目前没有可重用的内容


我能想到的这个过滤器的一个可能场景是构建内部DirectShow拓扑,为MF客户端提供元数据信息

如果WMP不能通过MF播放,则通过DirectShow播放。是的,但他们仍然使用MF播放DirectShow源代码(通过使用MFSourceFilter)。所以基本上,这就是我想要的。我想知道是否可以重用该MFSourceFilter。wmplayer的mftrace输出得知他们使用
MFSourceFilter
而不是
视频渲染器
作为输出,因为他们将解码输出传递给MF。我知道我可以自己编写程序,并在未来几年内修复bug。所以我想知道WMPLAG的这个机制是否可以被重新使用……你正在描述一些东西,然后切换回DirectShow,然后把它带回到MediaFoundation,以解决丢失的块。我认为这不会发生:最终WMP使用完全构建的DShow拓扑,甚至是EVR的DShow接口。所以WMP只是完全通过DShow使用其备用代码路径来播放它,这就是我们相信正在发生的事情。为您提供更多信息:WMP尝试使用
MF Source Filter
构建图形,然后从fresh中清理并构建播放图形。我想对于一些(不是MPEG-2)媒体来说,使用这个未记录的过滤器可以解决问题,但我不知道有任何真实的情况。在mftrace output中,在播放之前,会调用
IMFTTransform::SetInputType
/
SetOutputTime
/
ProcessInput
/
ProcessOutput
。但由于调用来自另一个threadid,因此它们可能与随后发生的directshow播放无关。