Хорошо, я некоторое время оглядывался по сторонам, и в настоящее время я довольно озадачен. Я был бы признателен за любую помощь, которую я могу найти в этом.
У меня есть приложение, которое открывает несколько камер на нескольких графиках фильтров. Каждый из них идентичен, поэтому я просто собираюсь проиллюстрировать один из них. идея высокого уровня заключается в том, что видеопоток 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 / РЕШЕНИЕ
Мне удалось заставить его работать, запустив график фильтра, затем выбрав значок на панели задач фильтра и установив деинтерлейсинг в меню, щелкнув правой кнопкой мыши по значку. Это сработало отлично. Спасибо Роману Р. за помощь.
Вам необходимо создать экземпляр 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 в качестве промежуточного фильтра.
Других решений пока нет …