Как использовать пользовательский фильтр источника захвата в приложении C++?

Я пишу OpenCV на С++, который использует OpenCV, который захватывает кадры с нескольких видеоустройств, выполняет на них серию преобразований, а затем создает новый кадр для отображения (в форме IplImage). Это все работает отлично.

Затем я хочу создать экземпляр фильтра источника захвата и отправить ему эти кадры, чтобы создать виртуальное видеоустройство, которое можно использовать с такими программами, как Skype. Вот тут у меня проблемы.

Я взглянул на образец видеокамеры Вивека (исходный фильтр захвата из здесь), который кажется быть идеальным, но я изо всех сил пытаюсь понять, как изменить его для использования в моем приложении:

  1. Vcam заполняет буфер случайными значениями, а я хочу заполнить его данными из моего фрейма.

  2. Vcam создает файл DLL, который необходимо зарегистрировать перед созданием фильтра, но я хочу создать фильтр при запуске моего приложения, а затем удалить его, когда он завершится.

Я совершенно новичок в DirectShow и программирую на C++ всего несколько месяцев, так что я в этом не разбираюсь. Может ли кто-нибудь наметить шаги, которые мне нужно предпринять, чтобы реализовать два вышеуказанных изменения?

Спасибо, Фил


person user3311579    schedule 14.02.2014    source источник


Ответы (1)


Ваши вопросы несколько широки для конкретного ответа.

Vcam заполняет буфер случайными значениями, а я хочу заполнить его данными из моего фрейма.

Источник видео рекламирует определенные форматы видео, затем соглашается на один из них, когда он подключен к чему-то другому, и тогда данные полезной нагрузки должны иметь этот согласованный формат. Вы должны позаботиться обо всех шагах здесь. Предположительно, ваша обработка использует какой-то фиксированный формат, либо вы можете заблокировать его на начальном этапе разработки. Затем фильтр должен объявить об этом на своем выходном выводе и отклонить попытку подключения с любым другим форматом. Затем вы копируете свои данные в буферы, и, поскольку форматы совпадают, подключенная сторона получает данные, соответствующие типу носителя соединения.

Vcam создает файл DLL, который необходимо зарегистрировать перед созданием фильтра, но я хочу создать фильтр при запуске моего приложения, а затем удалить его, когда он завершится.

Это не так, как это должно работать. Я предполагаю, что вам нужен этот фильтр, потому что вы хотите интегрироваться с другим программным обеспечением, которое ищет доступные «камеры», видеоисточники. И вы хотите сделать свой собственный доступным как таковой. Этот трюк требует, чтобы вы зарегистрировали свою камеру, и тогда вы, вероятно, позаботитесь о межпроцессном взаимодействии, потому что источник будет размещен в другом процессе, и вы должны каким-то образом передать туда свои данные.

Это в основном требует, чтобы вы полностью зарегистрировали свой источник как автономное устройство с возможностью принимать данные из вашего приложения и передавать их дальше с использованием стандартного API, а также иметь внутреннюю информацию о межпроцессном взаимодействии. Конечно, вы можете снять его (отменить регистрацию), когда ваше приложение завершится. Я полагаю, вы недооцениваете поток данных, о котором вам придется заботиться.

person Roman R.    schedule 14.02.2014