Pregunta

Se supone que debo proporcionar a mis usuarios una forma realmente sencilla de capturar clips de video desde la ventana principal de mi aplicación OpenGL. Estoy pensando en agregar botones y / o atajos de teclado para iniciar y detener la captura; al comenzar, podría pedir un nombre de archivo y otras opciones, si las hubiera. Tiene que ejecutarse en Windows (XP / Vista), pero tampoco me gustaría cerrar la puerta de Linux que hasta ahora he podido mantener abierta.

La aplicación utiliza programas de fragmento y sombreado de OpenGL, los efectos debido a los cuales necesito tener en los videos finales.

Me parece que podría haber incluso varios enfoques diferentes que podrían cumplir mis requisitos (pero realmente no sé dónde debería empezar):

  • Una biblioteca de codificación con funciones como startRecording (nombre de archivo), stopRecording y captureFrame. Podría llamar a captureFrame () después de cada fotograma renderizado (o cada segundo / tercero / lo que sea). Si hacerlo hace que mi programa se ejecute más lentamente, no es realmente un problema.

  • Un programa externo independiente que se puede controlar mediante programación desde mi aplicación. Después de todo, un programa independiente que no se puede controlar no casi hace lo que necesito ... Pero, como he dicho, debería ser realmente sencillo para los usuarios operar, y también apreciaría la perfección; Mi aplicación normalmente se ejecuta en pantalla completa. Además, debería ser posible distribuirlo como parte del paquete de instalación para mi aplicación, que actualmente preparo con NSIS.

  • Utilice la API de Windows para capturar capturas de pantalla fotograma a fotograma, luego emplee (por ejemplo) uno de los bibliotecas mencionadas aquí . Parece ser bastante fácil encontrar ejemplos de cómo capturar capturas de pantalla en Windows; sin embargo, me encantaría una solución que realmente no me obligue a tener mis manos muy sucias en el nivel de WinAPI.

  • Usa OpenGL para renderizar en un objetivo fuera de la pantalla, luego usa una biblioteca para producir el video. No sé si esto es posible, y me temo que, de todos modos, podría no ser el camino de menos dolor. En particular, no me gustaría que la representación real tome una ruta de ejecución diferente dependiendo de si el video se captura o no. Además, evitaría cualquier cosa que pudiera disminuir la velocidad de fotogramas en el modo normal, sin captura.

Si la solución fuera libre en cualquier sentido de la palabra, sería genial, pero no es un requisito absoluto. En general, cuanto menos hinchazón haya, mejor. Por otro lado, por razones más allá de esta pregunta, desafortunadamente no puedo vincular ningún código solo de GPL.

Con respecto al formato del archivo, no puedo esperar que mis usuarios comiencen a buscar en Google para cualquier códecs, pero siempre que mostrar los videos sea lo suficientemente fácil para un usuario de Windows de nivel básico, no lo hago. realmente importa cuál es el formato. Sin embargo, sería genial si fuera posible controlar la calidad de compresión de la salida.

Solo para aclarar: no necesito capturar video desde un dispositivo externo como una videocámara, ni estoy realmente interesado en los movimientos del mouse, aunque tampoco me perjudique conseguirlos. No hay requisitos de audio; La aplicación no hace ningún ruido.

Escribo C ++ con Visual Studio 2008, ya que esta aplicación también se beneficia de GLUT y GLUI. Tengo una comprensión sólida sobre C ++ y la vinculación de bibliotecas y ese tipo de cosas, pero por otro lado, OpenGL es bastante nuevo para mí: hasta ahora, solo he aprendido las partes necesarias para realmente hacer mi trabajo.

No necesito una solución con mucha urgencia, así que no dude en tomarse su tiempo :)

¿Fue útil?

Solución

Aquí hay dos preguntas diferentes: cómo capturar fotogramas de una aplicación OpenGL y cómo convertirlos en un archivo de película.

La primera pregunta es bastante fácil; simplemente toma cada fotograma con glReadPixels () (a través de un PBO si necesitas el rendimiento).

La segunda pregunta es un poco más difícil ya que las soluciones multiplataforma (ffmpeg) tienden a ser GPL'd o LGPL'd. ¿Es LGPL aceptable para su proyecto? La forma en que Windows hace esto (DirectShow) es un poco doloroso de usar.

Editar: Dado que LGPL está bien y puede usar ffmpeg, consulte here para ver un ejemplo de cómo codificar un video.

Otros consejos

Esto parece bastante relevante para fusionarse en un AVI ( como lo sugirió Andrew), sin embargo, realmente esperaba evitar los LPBITMAPINFOHEADERs, etc.

Gracias por las respuestas, informaré sobre el éxito si va a haber alguna :)

Mientras tanto, se agradecerán sugerencias adicionales para codificar los cuadros sin procesar de glReadPixels en clips de video.

Editar: Hasta ahora, ffmpeg sugerido por Mike F parece ser el camino a seguir. Sin embargo, todavía no me metí en la implementación real, ¡pero espero que eso cambie en un futuro cercano!

La opción más fácil es guardar cada fotograma renderizado dentro de tu aplicación y luego fusionarlos en un AVI. Cuando tiene AVI, hay muchas bibliotecas disponibles que pueden convertirlo en un formato más óptimo, o posiblemente omitir el paso de AVI por completo.

En términos de obtener cada fotograma, puede lograr esto representando una textura fuera de la pantalla como sugiera o usando el backbuffer directamente como fuente si su hardware lo admite. Hacer cualquiera de estos (y guardar cada fotograma) va a ser difícil sin una gran penalización en la velocidad de fotogramas.

Si su aplicación es determinista, puede " grabar " las acciones de los usuarios como una serie de entradas y luego tienen un modo de exportación que las procesa secuencialmente en una superficie fuera de la pantalla para generar el AVI.

Tuve que crear un proyecto de demostración para grabar una representación de OpenGL en un video. Utilicé glReadPixels para obtener los datos de píxeles y creé el video con cvWriteFrame de OpenCV. OpenCV te permite escribir en divx o incluso x264 / vp8 (con ffmpeg compilado).

Tengo una reseña más detallada en mi blog junto con un proyecto de muestra. http://tommy.chheng.com/ 2013/09/09 / encode-opengl-to-video-with-opencv /

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top