Я строю рекордер, используя карту BlackMagic DeckLink.
Программа использует OpenGL для отображения Frames и FFMPEG (с помощью метода glReadPixels ()) для их записи.
Я устанавливаю область просмотра в моей программе, чтобы применить автоматическое поле букв / столбов, если изображение / монитор равен 16: 9/4: 3.
Проблема в том, что когда я снимаю эти кадры этого окна просмотра, они, конечно, записываются в разрешении моего окна просмотра (т.е. Full Hd source -> viewport из-за монитора с разрешением 1600×1200 -> letterbox вплоть до 1600×900) и, таким образом, записи FFMPEG эти 1600×1200 с черными полосами сверху / снизу.
Есть ли возможность захватить кадр RAW до того, как он будет передан через функцию setViewport и все вещи, связанные с масштабированием?
Ну, в какой-то момент изображение передается в OpenGL. Почему бы вам просто не взять эти данные и напрямую передать их в FFMPEG, вместо того, чтобы делать длительные, неэффективные и дорогостоящие поездки по OpenGL.
Если OpenGL используется для преобразования цветового пространства в реальном времени, то я предлагаю вам сделать это для рендеринга в FBO с текстурой, привязанной к размеру разрешения видео, используйте glReadPixels для этого FBO (предпочтительно в PBO); и, наконец, нарисовать текстуру на главном экране в этом разрешении окна.
Однако, если вы можете просто передать необработанные кадры непосредственно в FFMPEG (который также может выполнять преобразование цветового пространства), я настоятельно рекомендую вам сделать это.