Speichern der openGL-Kontext als video-Ausgang

Ich bin versucht derzeit, speichern Sie die animation in openGL zu einer video-Datei. Ich habe versucht mit openCV's videowriter aber keinen Vorteil. Ich habe erfolgreich in der Lage, eine Momentaufnahme zu generieren und speichern Sie es als bmp mit der SDL Bibliothek. Wenn ich speichern Sie alle Schnappschüsse, die Sie und erstellen Sie dann das video mit ffmpeg, das ist wie das sammeln von 4 GB im Wert von Bildern. Nicht sinnvoll ist.
Wie kann ich schreiben, video-frames direkt beim Rendern?
Hier der code, den ich verwenden, um Schnappschüsse zu machen, wenn ich verlangen:

void snapshot(){
SDL_Surface* snap = SDL_CreateRGBSurface(SDL_SWSURFACE,WIDTH,HEIGHT,24, 0x000000FF, 0x0000FF00, 0x00FF0000, 0);
char * pixels = new char [3 *WIDTH * HEIGHT];
glReadPixels(0, 0,WIDTH, HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, pixels);

for (int i = 0 ; i <HEIGHT ; i++)
    std::memcpy( ((char *) snap->pixels) + snap->pitch * i, pixels + 3 * WIDTH * (HEIGHT-i - 1), WIDTH*3 );

delete [] pixels;
SDL_SaveBMP(snap, "snapshot.bmp");
SDL_FreeSurface(snap);
}

Muss ich die video-Ausgabe. Ich habe entdeckt, dass ffmpeg können verwendet werden, um videos zu erstellen von C++ - code, aber nicht in der Lage, herauszufinden, den Prozess. Bitte um Hilfe!!

BEARBEITEN : ich habe versucht mit openCV CvVideoWriter Klasse, aber das Programm stürzt ab ("segmentation fault") der moment, in der Sie deklariert ist.Zusammenstellung zeigt keine Fehler, natürlich. Irgendwelche Vorschläge dazu?

LÖSUNG FÜR PYTHON NUTZER (Erfordert Python2.7,python-imaging,python-opengl,python-opencv, codecs von format, das Sie möchten, zu schreiben, ich bin auf Ubuntu 14.04 64-bit):

def snap():
    pixels=[]
    screenshot = glReadPixels(0,0,W,H,GL_RGBA,GL_UNSIGNED_BYTE)
    snapshot = Image.frombuffer("RGBA",W,H),screenshot,"raw","RGBA",0,0)
    snapshot.save(os.path.dirname(videoPath) + "/temp.jpg")
    load = cv2.cv.LoadImage(os.path.dirname(videoPath) + "/temp.jpg")
    cv2.cv.WriteFrame(videoWriter,load)

Hier W und H sind die Fenster-Dimensionen (Breite,Höhe). Was passiert ist, ich bin mit PIL zum konvertieren der raw-Pixel Lesen aus der glReadPixels Befehl in eine JPEG Bild. Ich bin laden, dass JPEG in der openCV Bild und Schrift, um die videowriter. Ich hatte bestimmte Probleme direkt mit dem PIL-Bild in der videowriter (das sparen würde Millionen von Taktzyklen des I/O), aber jetzt bin ich nicht arbeiten. Image ist ein PIL Modul cv2 ist ein python-opencv Modul.

  • Anstatt ffmpeg, das ist ein Befehlszeilen-Dienstprogramm zum codieren von video, das Sie verwenden sollten libavcodec und libavformat. Dies sind die Bibliotheken auf denen ffmpeg ist tatsächlich aufgebaut, und erlaubt Ihnen zu Kodieren von video-und speichern Sie es in einem standard-stream/interchange format (z.B. RIFF/ - AVI), ohne ein separates Programm.
  • kann ich einen Hinweis, wie diese Bibliotheken zu nutzen, weil ich auch überprüft diese, nicht genug Daten, um zu begreifen, wie die Arbeit
Schreibe einen Kommentar