2016-05-11 5 views
0

Я начал писать некоторый потоковый код, который соединяет сеанс Windows Media Foundation с потоковой библиотекой live555. До сих пор я начал писать IMFMediaSink и свой собственный IMFStreamSink. Однако код быстро стал довольно сложным.Действительно ли IMFSampleGrabberSinkCallback действительно раковина?

Мне было интересно, могу ли я использовать IMFSampleGrabberSinkCallback, поскольку он просто получит образцы, которые я бы перевел на live555.

Перед тем, как реорганизовать код, я задаюсь вопросом, действительно ли приемник MF - это раковина - я помню, что в DirectShow образец граббера не мог использоваться без другой раковины, поскольку это было преобразование. Могу ли я построить топологию, которая получает образцы, передает их через DMO, кодер и, наконец, в раковину без каких-либо других узлов?

Кроме того, интересно, каковы будут недостатки такого подхода (при условии, что он будет работать)? Очевидным я вижу, что IMFMediaSink поддерживает несколько потоков и, следовательно, может координировать аудио и видео. Однако, поскольку live555 делает это исключительно через временные метки, я не получаю от этого никакой реальной выгоды. Есть ли другие недостатки?

ответ

1

Образец Grabber работает практически так же, как и Grabber для DirectShow: вы можете вставить объект конвейера с дополнительным упрощенным внешним интерфейсом, чтобы получить возможность «экспортировать» данные полезной нагрузки из конвейера по потоку. Вы предоставляете интерфейс обратного вызова для вызова, поскольку новые данные доступны. Это справедливо для обоих захватчиков образцов.

DirectShow SG более гибкий в терминах, что это преобразование, и вы можете добавить его в любую точку топологии. MF SG является только выходным узлом. MF SG предлагает больше методов обратного вызова (IMFClockStateSink методов). DirectShow SG - действительно простой фильтр, вариант которого доступен в исходном коде как образец SDK.

DirectShow SG не был первоначально ядром API, но был очень популярен среди разработчиков. Я полагаю, что его популярность была основной причиной того, что аналогичный компонент был разработан для MF: они сохранили именование, концепцию - все. В то же время Microsoft удалила DirectShow SG и исключила ее из самых последних версий ОС, хотя ясно, что API все еще используется. Переходите к логике.

+0

Спасибо за ваши замечания, но позвольте мне перефразировать мой вопрос: я не понимаю, как MF SG будет работать как выходной узел, потому что, как я понимаю, выходной узел запускает генерацию выборок в восходящем узле путем повышения 'MEStreamSinkRequestSample' , Однако 'IMFSampleGrabberSinkCallback' не является' IMFMediaEventGenerator', как 'IMFStreamSink'. У меня есть (как-то) рабочая версия, основанная на 'IMFMediaSink' и' IMFStreamSink', и она не получает образец без этого события ... – Christoph

+1

Вы не подключаете 'IMFSampleGrabberSinkCallback' прямо туда в конвейер. Сам образец grabber реализует то, что требуется, чтобы быть частью топологии, поэтому он сам использует данные, позволяя вам не слишком беспокоиться о деталях. Кроме того, он принимает интерфейс обратного вызова, чтобы уведомлять вас о данных. Они проектировали SG как медиа-приемник в MF, поэтому он выступает в качестве выходного узла.Кроме того, если вы хотите читать только из источника MF, я бы вместо этого посмотрел на источник. Исходный считыватель также позволяет автоматическим декодерам (при необходимости), и вы будете получать данные синхронно и асинхронно. –

+0

OK ... Итак, 'MFCreateSampleGrabberSinkActivate' создает для меня узел, который реализует' IMFMediaSink', извлекает данные и пересылает их в 'IMFSampleGrabberSinkCallback', я передаю' MFCreateSampleGrabberSinkActivate'? Я не понял эту идею из документации ... – Christoph

1

Вы можете вызвать функцию MFCreateSampleGrabberSinkActivate для создания активированного объекта MF. Эта функция требует MediaType - это должен быть тип кодирования, который необходим в вашем коде. Вы можете найти пример кода для захвата видео с веб-камеры через MF на сайте videoinput. Он включает исходный код и позволяет захватить кадры в форматах RGB24, RGB32, AYUV. Если вы установите формат H264, MF найдет подходящий кодер для него и обратный вызов SampleGrabberSink с данными формата H264, но вы должны установить правильный MediaType.

С уважением.

+0

Спасибо за обмен кодом - я посмотрю на него и дам вам знать, отвечает ли он на мой вопрос. – Christoph

Смежные вопросы