Таинственный MFSourceFilter

Несколько дней назад я хотел дать 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 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 с MFSourceFilter, который, как я полагаю, передает декодированную аудио/видео информацию в Media Foundation. Поскольку поиск в Интернете MFSourceFilter вообще не помогает, мне было интересно, использовал ли кто-нибудь этот MFSourceFilter раньше и с чего мне начать.

(Я уже читал вопрос декодировать видео MPEG1/2 с помощью Media Foundation но там нет того, что я ищу.)


person huysentruitw    schedule 22.07.2013    source источник
comment
WMP воспроизводится через DirectShow, если не может через MF.   -  person Roman R.    schedule 22.07.2013
comment
Да, но они по-прежнему используют MF для воспроизведения источника DirectShow (используя этот MFSourceFilter). Так что в основном, это то, что я после. Я хочу знать, могу ли я повторно использовать этот MFSourceFilter.   -  person huysentruitw    schedule 22.07.2013


Ответы (1)


WMP использует Media Foundation, а если не повезет, обходит через DirectShow.

Вот пример воспроизведения WMP для файла MPEG-2 в Windows 7. Проигрыватель Windows Media внутренне построил график DirectShow и выбрал из доступных декодеров MPEG-2.

введите здесь описание изображения

Это фактическое воспроизведение полностью поддерживается DirectShow, источник этого воспроизведения является обычным Фильтр источника файлов (асинхронный). WMP может использовать рассматриваемый фильтр для получения информации (особенно о типах мультимедиа), связанной с воспроизведением, или по другим причинам, характерным для его внутренней реализации. Возможно, даже пытаясь заменить источник мультимедиа для воспроизведения, однако я вижу, что этот фильтр удален, и остается обычное воспроизведение DirectShow.

Суть в том, что Media Foundation DirectShow Wrapper и Source Resolver существуют, но они не документированы, временно используются WMP (возможно, прозрачно используются MF) и не используются при реальном воспроизведении. Следовательно, нечего повторно использовать в данный момент.

Один из возможных сценариев для этого фильтра, о котором я могу думать, состоит в том, чтобы построить внутреннюю топологию DirectShow для предоставления информации метаданных для клиента MF.

person Roman R.    schedule 22.07.2013
comment
Выходные данные mftrace от wmplayer узнают, что они используют MFSourceFilter вместо Video Renderer в качестве вывода, потому что они передают декодированный вывод в MF. Я знаю, что могу запрограммировать все это сам и исправить ошибки на долгие годы. Поэтому мне интересно, можно ли повторно использовать этот механизм wmplayer... - person huysentruitw; 22.07.2013
comment
Вы описываете что-то, что переключается обратно на DirectShow, а затем возвращает его обратно в Media Foundation для разрешения отсутствующих блоков. Я не думаю, что это происходит: в конечном итоге WMP использует полностью построенную топологию DShow, даже интерфейс DShow для EVR. Таким образом, WMP просто полностью воспроизводит его через DShow, используя свой альтернативный путь кода, вот что, по-видимому, происходит. - person Roman R.; 22.07.2013
comment
Еще немного информации для вас: WMP пытается построить график, используя MF Source Filter, затем очищает и строит график воспроизведения заново. Предполагаю, что для некоторых (не MPEG-2) носителей это может сработать с этим недокументированным фильтром, но реальных случаев мне не известно. - person Roman R.; 22.07.2013
comment
Что ж, думаю, ты прав. В выходных данных mftrace есть вызовы IMFTransform::SetInputType/SetOutputTime/ProcessInput/ProcessOutput перед воспроизведением. Но поскольку вызовы исходят от другого threadid, они, возможно, не имеют ничего общего с воспроизведением directshow, которое происходит впоследствии. - person huysentruitw; 22.07.2013