Domanda

Dovrei fornire ai miei utenti un modo davvero semplice per catturare video clip dalla finestra principale della mia applicazione OpenGL. Sto pensando di aggiungere pulsanti e / o scorciatoie da tastiera per avviare e interrompere l'acquisizione; all'avvio, potrei chiedere un nome file e altre opzioni, se presenti. Deve funzionare su Windows (XP / Vista), ma non vorrei nemmeno chiudere la porta di Linux che finora sono stata in grado di tenere aperta.

L'applicazione utilizza frammenti OpenGL e programmi shader, gli effetti a causa dei quali devo assolutamente avere nei video eventuali.

Mi sembra che potrebbero esserci anche diversi approcci che potrebbero potenzialmente soddisfare i miei requisiti (ma non so davvero dove dovrei iniziare):

  • Una libreria di codifica con funzioni come startRecording (nomefile), stopRecording e captureFrame. Potrei chiamare captureFrame () dopo ogni fotogramma renderizzato (o ogni secondo / terzo / qualunque cosa). Se ciò rende il mio programma più lento, non è davvero un problema.

  • Un programma esterno autonomo che può essere controllato a livello di programmazione dalla mia applicazione. Dopotutto, un programma autonomo che può essere non quasi controllato fa quasi quello di cui ho bisogno ... Ma, come detto, dovrebbe essere davvero semplice per gli utenti, e apprezzerei anche la fluidità; la mia applicazione in genere funziona a schermo intero. Inoltre, dovrebbe essere possibile distribuire come parte del pacchetto di installazione per la mia applicazione, che attualmente sto preparando utilizzando NSIS.

  • Utilizza l'API di Windows per acquisire schermate fotogramma per fotogramma, quindi utilizza (ad esempio) uno dei librerie menzionate qui . Sembra essere abbastanza facile trovare esempi di come catturare schermate in Windows; tuttavia, mi piacerebbe una soluzione che non mi costringa davvero a sporcarmi le mani a livello di WinAPI.

  • Usa OpenGL per eseguire il rendering in una destinazione fuori schermo, quindi usa una libreria per produrre il video. Non so se sia possibile, e temo che potrebbe non essere la via del minimo dolore. In particolare, non vorrei che il rendering effettivo prendesse un percorso di esecuzione diverso a seconda che il video fosse catturato o meno. Inoltre, eviterei qualsiasi cosa possa ridurre la frequenza dei fotogrammi nella normale modalità non di acquisizione.

Se la soluzione fosse libera in entrambi i sensi, allora sarebbe fantastico, ma non è davvero un requisito assoluto. In generale, meno è gonfio, meglio è. D'altra parte, per motivi che vanno oltre questa domanda, sfortunatamente non posso collegarmi a nessun codice solo GPL.

Per quanto riguarda il formato del file, non posso aspettarmi che i miei utenti inizino a cercare su Google i codec, ma fintanto che visualizzano i video sono abbastanza facili per un utente Windows di livello base, non importa davvero quale sia il formato. Tuttavia, sarebbe fantastico se fosse possibile controllare la qualità di compressione dell'output.

Solo per chiarire: non ho bisogno di catturare video da un dispositivo esterno come una videocamera, né sono veramente interessato ai movimenti del mouse, anche se ottenerli non fa male. Non ci sono requisiti per quanto riguarda l'audio; l'applicazione non emette alcun rumore.

Scrivo C ++ usando Visual Studio 2008, proprio per questa applicazione sfruttando anche GLUT e GLUI. Ho una solida conoscenza del C ++ e del collegamento nelle librerie e quel genere di cose, ma d'altra parte OpenGL è abbastanza nuovo per me: finora, ho davvero imparato solo i bit necessari per portare a termine il mio lavoro.

Non ho bisogno di una soluzione con estrema urgenza, quindi sentiti libero di prenderti il ??tuo tempo :)

È stato utile?

Soluzione

Ci sono due domande diverse qui: come afferrare i frame da un'applicazione OpenGL e come trasformarli in un file di film.

La prima domanda è abbastanza semplice; prendi semplicemente ogni frame con glReadPixels () (tramite un PBO se hai bisogno delle prestazioni).

La seconda domanda è un po 'più difficile poiché le soluzioni multipiattaforma (ffmpeg) tendono ad essere GPL o LGPL. LGPL è accettabile per il tuo progetto? Il modo Windows per farlo (DirectShow) è un po 'un mal di testa da usare.

Modifica: poiché LGPL è ok e puoi usare ffmpeg, vedi qui per un esempio di come codificare i video.

Altri suggerimenti

Questo sembra abbastanza rilevante per la fusione in un AVI ( come suggerito da Andrew), tuttavia speravo davvero di evitare gli LPBITMAPINFOHEADER ecc.

Grazie per le risposte, riferirò sul successo se ce ne sarà uno :)

Nel frattempo, sarebbero apprezzati ulteriori suggerimenti per codificare i fotogrammi grezzi da glReadPixels in video clip.

Modifica: Finora, ffmpeg suggerito da Mike F sembra essere la strada da percorrere. Tuttavia, non sono ancora entrato nell'implementazione effettiva, ma spero che cambierà nel prossimo futuro!

L'opzione più semplice sarà quella di salvare ogni fotogramma renderizzato all'interno della tua app e poi unirli in un AVI. Quando hai l'AVI ci sono molte librerie disponibili che possono convertirlo in un formato più ottimale o eventualmente saltare del tutto il passaggio dell'AVI.

In termini di ottenimento di ciascun fotogramma, è possibile ottenere questo risultato trasformandolo in una trama fuori schermo come suggerito o utilizzando direttamente il backbuffer come sorgente se l'hardware lo supporta. Fare una di queste (e salvare ogni fotogramma) sarà difficile senza una pesante penalità su framerate.

Fornire la tua applicazione è deterministico potresti "registrare" le azioni degli utenti come una serie di input e quindi dispongono di una modalità di esportazione che li rende sequenzialmente su una superficie fuori schermo per generare l'AVI.

Ho dovuto creare un progetto demo per registrare un rendering OpenGL in un video. Ho usato glReadPixels per ottenere i dati pixel e ho creato il video con cvWriteFrame di OpenCV. OpenCV ti permette di scrivere in divx o anche x264 / vp8 (con ffmpeg compilato).

Ho un commento più dettagliato sul mio post sul blog insieme a un progetto di esempio. http://tommy.chheng.com/ 2013/09/09 / encode-opengl-to-video-con-OpenCV /

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top