Кодирование FFDShow в граф DirectShow для деинтерлейсинга?

Хорошо, я некоторое время оглядывался по сторонам, и в настоящее время я довольно озадачен. Я был бы признателен за любую помощь, которую я могу найти в этом.

У меня есть приложение, которое открывает несколько камер на нескольких графиках фильтров. Каждый из них идентичен, поэтому я просто собираюсь проиллюстрировать один из них. идея высокого уровня заключается в том, что видеопоток PAL считывается через карту видеозахвата, а затем обрабатывается нашим приложением. Приложение строит графики видеофильтров DirectShow. Каждый график включает в себя источник видео, фильтр сэмплера и фильтр нулевого рендеринга. Захваченные образцы затем используются для отображения различных фотографий из видео и для рисования и масштабирования с помощью OpenCV. Итак, текущий график фильтра выглядит примерно так:

[Источник видео] -> [/ * Какой-то фильтр кодеков * /] -> [Sample Grabber] -> [Null Renderer]

Я говорю «какой-то», потому что я разрешаю DirectShow отображать его сам, используя

hr = pCaptureGraphs[i]->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pSourceFilters[i], pGrabberFilters[i], pNullRendFilters[i]);

Однако у меня есть проблема с чересстрочной разверткой, исходящей из видео PAL. Используя FFDShow и приложение GraphEditor, я построил график, аналогичный приведенному выше, но с фильтром FFDShow перед SampleGrabber, настроенным для кубического деинтерлейсинга в видеопотоке. Или, что еще лучше, используйте его для декодирования видеопотока, поступающего от видеозахвата, и деинтерлейсинга.

Моя проблема заключается в следующем: я понятия не имею, как создать фильтр FFDShow в коде. Есть ли способ добавить фильтр в код, и если да, что мне включить или сделать ссылку на проект для этого? В качестве альтернативы, есть ли способ настроить DirectShow для использования фильтра FFDShow, который выполняет деинтерлейсинг при вызове RenderStream?

Любая помощь по этой теме будет оценена.

ОБНОВЛЕНИЕ 1:

Итак, я обнаружил, что ПК, на котором я разрабатывал, машина Windows 8.1, по какой-то причине не запускает фильтр FFDShow, но на целевой машине, машине Windows 7, точно работает тот же самый код. Кажется, там какая-то несовместимость. : /

Теперь перейдем к следующему этапу: деинтерлейсинг. Мне удалось изолировать фильтр Sample Grabber и предшествующий ему фильтр (в данном случае декомпрессор AVI), и я отключил их друг от друга, а затем подключил необработанный видеофильтр FFDShow между ними. Другой фильтр FFDShow каким-то образом портит график, так что из примера захвата не читаются выходные данные, поэтому я использую предыдущий фильтр. Теперь возникает вопрос, как я могу активировать деинтерлейсинг видео канала? Я построил тот же график в программе GraphEdit, и чересстрочная развертка исчезла, поэтому я знаю, что фильтр способен это делать. Но как мне включить его в коде?

ОБНОВЛЕНИЕ 2 / РЕШЕНИЕ

Мне удалось заставить его работать, запустив график фильтра, затем выбрав значок на панели задач фильтра и установив деинтерлейсинг в меню, щелкнув правой кнопкой мыши по значку. Это сработало отлично. Спасибо Роману Р. за помощь.

0

Решение

Вам необходимо создать экземпляр FFDshow Video Decoder в коде, например:

class __declspec(uuid("{04FE9017-F873-410E-871E-AB91661A4EF7}")) FfdshowVideoDecoder;
CComPtr<IBaseFilter> pBaseFilter;
HRESULT nResult = pBaseFilter.CoCreateInstance(__uuidof(FfdshowVideoDecoder));

Затем вы IGraphBuilder::AddFilter на график фильтра

И тогда вы запрашиваете ввод / вывод IPinиз этого экземпляра и подключитесь к другим фильтрам соответствующим образом, как в интерактивном режиме. Вы можете сделать это RenderStream также, если вы используете этот IBaseFilter в качестве промежуточного фильтра.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]