Sample Grabber Sink не устанавливает тип GUID носителя - PullRequest
0 голосов
/ 21 января 2020

Я использую пример кода со справочной страницы Srab Grabber Sink , за исключением того, что я обрабатываю файл mp4 для получения сэмплов аудио и видео (мой пример кода ) , Чтобы обработать образцы в обратном вызове, мне нужно знать, какие из них являются аудио, а какие - видео. Проблема в том, что REFGUID guidMajorMediaType никогда не устанавливается.

Ниже приведены результаты распечатки свойств каждого образца обратного вызова. Меньшие сэмплы (менее 750 байт) - это аудио, а большие - видео. Но guidMajorMediaType всегда пуст. Возможно, мне нужно установить дополнительное свойство на IMFTopologyNode's? Я не мог обнаружить ничего очевидного.

Sample Grabber test console starting...
Guid = {00000000-0000-0000-0000-000000000000}
Sample: start = 0, duration = 426250, bytes = 682
Guid = {00000000-0000-0000-0000-000000000000}
Sample: start = 0, duration = 416666, bytes = 353280
Guid = {00000000-0000-0000-0000-000000000000}
Sample: start = 416666, duration = 416666, bytes = 353280
Guid = {00000000-0000-0000-0000-000000000000}
Sample: start = 426250, duration = 463750, bytes = 742
Guid = {00000000-0000-0000-0000-000000000000}
Sample: start = 833333, duration = 416666, bytes = 353280
Guid = {00000000-0000-0000-0000-000000000000}
Sample: start = 890000, duration = 465000, bytes = 744
Guid = {00000000-0000-0000-0000-000000000000}
Sample: start = 1250000, duration = 416666, bytes = 353280

Обновление: Похоже, что это может быть ошибкой Media Foundation (по крайней мере, она была воспроизведена двумя независимыми сторонами) .

1 Ответ

1 голос
/ 22 января 2020

От Использование 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.

...