Я начал писать некоторый потоковый код, который соединяет сеанс Windows Media Foundation с потоковой библиотекой live555. До сих пор я начал писать IMFMediaSink
и свой собственный IMFStreamSink
. Однако код быстро стал довольно сложным.Действительно ли IMFSampleGrabberSinkCallback действительно раковина?
Мне было интересно, могу ли я использовать IMFSampleGrabberSinkCallback
, поскольку он просто получит образцы, которые я бы перевел на live555.
Перед тем, как реорганизовать код, я задаюсь вопросом, действительно ли приемник MF - это раковина - я помню, что в DirectShow образец граббера не мог использоваться без другой раковины, поскольку это было преобразование. Могу ли я построить топологию, которая получает образцы, передает их через DMO, кодер и, наконец, в раковину без каких-либо других узлов?
Кроме того, интересно, каковы будут недостатки такого подхода (при условии, что он будет работать)? Очевидным я вижу, что IMFMediaSink
поддерживает несколько потоков и, следовательно, может координировать аудио и видео. Однако, поскольку live555 делает это исключительно через временные метки, я не получаю от этого никакой реальной выгоды. Есть ли другие недостатки?
Спасибо за ваши замечания, но позвольте мне перефразировать мой вопрос: я не понимаю, как MF SG будет работать как выходной узел, потому что, как я понимаю, выходной узел запускает генерацию выборок в восходящем узле путем повышения 'MEStreamSinkRequestSample' , Однако 'IMFSampleGrabberSinkCallback' не является' IMFMediaEventGenerator', как 'IMFStreamSink'. У меня есть (как-то) рабочая версия, основанная на 'IMFMediaSink' и' IMFStreamSink', и она не получает образец без этого события ... – Christoph
Вы не подключаете 'IMFSampleGrabberSinkCallback' прямо туда в конвейер. Сам образец grabber реализует то, что требуется, чтобы быть частью топологии, поэтому он сам использует данные, позволяя вам не слишком беспокоиться о деталях. Кроме того, он принимает интерфейс обратного вызова, чтобы уведомлять вас о данных. Они проектировали SG как медиа-приемник в MF, поэтому он выступает в качестве выходного узла.Кроме того, если вы хотите читать только из источника MF, я бы вместо этого посмотрел на источник. Исходный считыватель также позволяет автоматическим декодерам (при необходимости), и вы будете получать данные синхронно и асинхронно. –
OK ... Итак, 'MFCreateSampleGrabberSinkActivate' создает для меня узел, который реализует' IMFMediaSink', извлекает данные и пересылает их в 'IMFSampleGrabberSinkCallback', я передаю' MFCreateSampleGrabberSinkActivate'? Я не понял эту идею из документации ... – Christoph