EnDeRJaY
@EnDeRJaY
cout >> "Hello World!" >> endl;

Как создать программу для захвата видео с экрана?

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

1. Как создавать видеофайл? Не, создать просто, но как туда что-то записывать? Как я понял, видео - это поток, но поток чего? Какой поток я должен делать для видеофайлов и какой тип данных я должен туда записывать?

2. Как захватывать изображение? Насколько мне известно, OBS использует DirectX для захвата изображения, в простом захватчике скриншотов используется функция из user32.dll, что лучше, и что вы мне посоветуете?

3. Как я должен энкодить видео? Я не особо понимаю, как кодеки работают, и боюсь, что простое:"Кинь кадры в охапку, передай CUDA-ядрам, они их переведут, и обратно передай" не прокатит, буду рад, если вы объясните по какой схеме энкодеры примерно работают. И как влиять на сжатие? Не особо хочется 5-минутный файл на гигабайт

Это всё, 3 вопроса, но на данный момент без ответов на них, я не смогу сдвинуться с мёртвой точки
  • Вопрос задан
  • 1990 просмотров
Пригласить эксперта
Ответы на вопрос 2
GavriKos
@GavriKos
1. Читай спецификации. Есть разные форматы. Общий ответ - ты туда должен записывать байты.
2. Зависит от платформы. Но судя по всему винда - так что юзай DirectX, да
3. Зависит от формата, но в общем случае можно не энкодить, а юзать готовые библиотеки.
Ответ написан
Комментировать
@rPman
GpGpu для программиста на текущий момент выглядит так - на неком языке (все поддерживают opencl, а nvidia в частности свою cuda, но онро идеологически похоже), очень похожем на c++, пишется код, с одним callback методом, который будет вызываться последовательно и параллельно (это решит драйвер видеокарты, вы этим не почти управляете) для элементов вашего массива, который по факту - текстура в памяти (на низком уровне вы тут не заморачиваетесь) и сохраняет результат в другой.

Передача данных между обычным обычной оперативной памятью и видеокартой, объективно самая дорогая операция, и обычно стараются свести такие копирования к минимуму (т.е. на старте и под конец, для получения результата). Причем на столько, что к примеру получение содержимого экрана в оперативную память и копирование ее обратно в формате, понятному вашему cuda приложению будет занимать 99% времени если не 1099% (вы же хотите fullhd/4k 60 fps? а скорости может тупо не хватить), не говоря уже о самом преобразовании форматов.

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

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

p.s. nvidia уже вроде несколько лет назад пиарилась на том что разработала такие алгоритмы для эффективного стриминга экрана приложений и игр по сети с минимальной задержкой, в т.ч. в железе.
https://developer.nvidia.com/nvidia-video-codec-sdk
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы