От Использование Singer Grabber Sink
Source Reader является альтернативой Sample Grabber Sink и имеет более простую модель прогаммирования.
Вам действительно нужен Sample Grabber Sink? Source Reader - это современный способ сделать. Я бы сказал, что Sample Grabber Sink устарел.
Если да:
документация не ясна: MFCreateSampleGrabberSinkActivate function
Замечания Для создания В качестве примера приемника граббера вызовите IMFActivate :: ActivateObject для указателя, полученного в параметре ppIActivate.
В их примере «Использование выборочного приемника граббера» они этого не делают.
Возможно, используя IMFMediaSink после ActivateObject для IMFActivate, вы получите правильный guidMajorMediaType внутри OnProcessSample. Это просто оптимистичный c способ взглянуть на это. Но у меня есть сомнения по этому поводу.
Кажется, это ошибка. Я подтверждаю, что OnProcessSample передает GUID_NULL для REFGUID guidMajorMediaType. Это не должно происходить, потому что все остальные параметры кажутся действительными.
Я просто думаю, что Sample Grabber Sink устарел, и вы не должны его использовать.
Объясните, почему вам действительно нужно использовать sample grabber раковина, когда существуют другие решения, без ошибок.
Для меня «Sample Grabber Sink» - это всего лишь своего рода подход DirectShow, и теперь, с MediaSession, Source Reader, тройным узлом и так далее ... больше не имеет никакого интереса.
РЕДАКТИРОВАТЬ
Я хочу самый простой способ получить аудио и видео сэмплы в буфер байтов * из файла или устройства источник и в идеале быть в состоянии включить по крайней мере одно преобразование (например, кодер / декодер H264) между ними.
Source Reader делает именно это. Да, у вас нет байтового * буфера, у вас есть IMFSample. Но с помощью IMFSample вы можете получить байтовый * буфер.
Но документация по Source Reader также гласит: «Считыватель исходного кода не отправляет данные в пункт назначения; это зависит от приложения, которое использует данные .
Используя Sample Grabber Sink, вы можете использовать данные. Та же ситуация.
программа чтения исходного кода может читать видеофайл, но не может рендеринг видео на экран.
Sample Grabber Sink не будет отображать видео на экране. Та же ситуация.
Кроме того, программа чтения исходного кода не управляет часы представления, обрабатывайте проблемы с синхронизацией или синхронизируйте видео со звуком.
Это разница, да, но я не вижу никаких преимуществ. См. MF_SAMPLEGRABBERSINK_SAMPLE_TIME_OFFSET
Смещение между отметкой времени на каждом образце, полученном захватчиком образцов, и временем, когда захватчик образцов представляет образец.
Знаете ли вы, какой из fset для применения: дополнительная работа. Та же ситуация.
SampleGrabber возвращает аудио- и видеосэмплы в правильном порядке с правильными временными метками
Устройство чтения источника также возвращает аудио- и видеосэмплы в правильном заказ с правильными временными метками. Та же ситуация.
Разве это не будет дополнительной работой для случая Source Reader?
Нет, для меня это будет одинаковая дополнительная работа в обоих случаях.
Также:
Использование Source Reader: Source Reader -> ваше приложение
Использование Sample Grabber Sink: MediaSession (с Sample Grabber Sink) -> ваше приложение
С точки зрения производительности (использование процессора / памяти / потоков), я почти уверен, что Source Reader лучше, чем MediaSession.
Но вы сами должны выбрать Sample Grabber Sink. Я просто предлагаю вам сообщить Microsoft, что есть ошибка с REFGUID guidMajorMediaType.