Как получить видеокадр с аппаратного оверлея (не из моего приложения)?

Я искал способ получить кадр из видео, которое в настоящее время находится в аппаратном оверлее, и я не нашел ничего надежного. Все, что я нахожу, это либо для захвата кадров из видео, которое вы воспроизводите (в вашем приложении), либо для создания фильтра, для которого я не могу найти хороший пример того, как бы я на самом деле брал кадры в моем приложении (или может ли приложение быть фильтр в памяти, который не нужно "устанавливать" и выбирать в плеере?).

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

Я видел перехват для DirectX, чтобы получить всю информацию о DirectX, но аппаратные оверлеи не являются DirectX, не так ли? Или я могу просто подключиться к DirectX и получить оттуда фронтальный буфер или что-то еще?

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

Если это уместно, я бы предпочел решение на C++ (приложение, которое у меня есть, на C++ и в настоящее время использует "обычный" способ захвата скриншотов с экрана, который, конечно, оставляет черные прямоугольники для аппаратного наложения).

2 ответа

Если вам нужно изображение приложения в первую очередь и аппаратное наложение является препятствием для получения снимка, возможно, самым простым будет создание простого приложения, которое запускает воспроизведение видео через наложение (вам не нужно передавать реальные сэмплы! Просто приостановите графа будет достаточно) и запустите ваше приложение до запуска интересующего вас приложения.

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

Есть два способа, как я знаю, как захватывать кадры, используя directshow. Первый - с использованием фильтра SampleGrabber, в интернете есть много примеров. Во-вторых, с использованием вашего пользовательского видеореендера, в этом случае вам нужно реализовать свой собственный фильтр, вы можете использовать проект baceclasses из платформы sdk, чтобы извлечь из cbasevideorenderer и реализовать ваш метод рендеринга.

Другие вопросы по тегам