Проблема захвата видео в окне OpenGL

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

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

Как я могу сказать моему виджету/оконной системе обновить всю область при захвате движения?

Вероятно, это связано с той же проблемой: однажды я создал сеанс в TeamViewer, где возникла та же проблема.

ИЗМЕНИТЬ

Когда я использую Qt Demo Hello GL и фиксирую его, возникает та же проблема.

ИЗМЕНИТЬ2

Я попробовал одну из моих демонстраций GLUT, и они тоже не сработали, также я читал о проблемах с записью вывода opengl, но это было на машинах с Windows. Может на линуксе тоже проблемы?

Кстати. Я использую xvidcap для захвата.


person Nobody moving away from SE    schedule 14.09.2011    source источник
comment
похоже буфер не обновляется   -  person blueskin    schedule 14.09.2011


Ответы (2)


Кстати. Я использую xvidcap для захвата.

Я не уверен, но IIRC xvidcap использует расширение Xdamage только для захвата тех программ, которые сообщают о том, что они отображаются как новые. Операции OpenGL не устанавливают флаг повреждения.

Лично я использую ffmpeg для захвата экрана под X11. Что-то по линиям

ffmpeg -f x11grab -r $FRAMERATE -s $WIDTHx$HEIGHT -i $DISPLAY+$XOFFSET,$YOFFSET -vcodec ... -b -y output_file

Например

ffmpeg -f x11grab -r 18 -s 800x600 -i :0+0,0 -vcodec mjpeg out.avi

Я обнаружил, что кодеки mjpeg, ljpeg или x264 / fast lossless хорошо подходят для этой задачи.

person datenwolf    schedule 14.09.2011
comment
Спасибо за совет ffmpeg, я попробую. Однако это не решит проблему с TeamViewer. Вы знаете, как я могу установить флаг повреждения для области виджета GL? - person Nobody moving away from SE; 15.09.2011
comment
@Nobody: Насколько я могу судить, единственным чистым решением было бы изменение самого Qt QGLWidget. Действительно, я должен посмотреть исходный код, чтобы точно сказать. - person datenwolf; 15.09.2011

Это небольшое предположение, так как у меня мало опыта работы с виджетом GL, но первое, что я бы попробовал, это установить флаг события непрозрачной краски для вашего виджета:

setAttribute( Qt::WA_OpaquePaintEvent )
person Chris    schedule 14.09.2011
comment
Я просто написал это в конструкторе виджетов, но это ничего не изменило. - person Nobody moving away from SE; 14.09.2011