Seite 1 von 1

Video Herstellung

Verfasst: 21. Dezember 2006 13:47
von darmstadt
Hallo zusammen,

Ich programmiere gerade eine Anwendung in der Animationen angezeigt werden. Ich würde gern den Benutzer die Möglichkeit geben diese Animationen abzuspeichern. Nach Stunden Sucherei im Netz bin ich nicht viel weiter gekommen.

Momentan bestehen die Animation aus QPixmaps die jede x sec geplotet werden. Ich kann die aber meinetwegen umwandeln wenn es nötig ist.

Also die Frage: Wie kann man Viedos (irgend ein Format) aus QPixmap (oder ähnliche) herstellen und auf die Festplatte speichern? Ein Vorschlag (benötigte Qt-Klassen od c++ Klassen Linux/Windows) wäre echt net!

Vielen Dank.

Verfasst: 21. Dezember 2006 15:12
von ess
Hallo,
Videokodierung ist eine ziemlich knifflige Sache. Wenn du ein normales
Videoformat verwenden willst, mußt du entweder einen Video-Codec
verwenden, den du programmieren kannst (also zu dem du eine SDK
hast), oder du "darfst" dir aus einer Format-Beschreibung das ganze
selbst zusammenbasteln.
Das heisst, das Ganze ist sehr kommerziell aufgezogen (Windows) und
mit Patenten durchsetzt ... wenn du trotzdem weitermachen willst,
google mal nach dem RIFF-Format. Das ist die Beschreibungsstruktur
unter anderem von AVIs. Damit sollte es möglich sein, daß du ein
unkomprimiertes AVI generierst. Die einzelnen Frames sind meines
Wissens nach im Bitmap-Format abgelegt.
Unter Linux gibt es mencode (gehört zum mplayer-Paket), der aus
Einzelbildern Filme kodiert. Da stünde Quellcode zur Verfügung, in dem du
nachschauen kannst, wie das funktioniert.
Alternativ ginge vielleicht auch Animated-GIF (ist ja inzwischen patentfrei).
Der Haken: GIF ist nur für 256 Farben definiert.

Ich hoffe, daß dir das weitergeholfen hat.

Verfasst: 21. Dezember 2006 15:45
von darmstadt
Vielen Dank ess. Deine Antwort hilft mir sehr.

Ich habe weiter gesucht und habe den sogennanten GSTreamer gefunden.

http://gstreamer.freedesktop.org/


Hat jemadem schon damit Erfahrungen? Kann man es mit Qt benutzen ohne die Portabilität der Anwendung zu verlieren?

Danke

Verfasst: 21. Dezember 2006 16:10
von Volker
Also ich benutz für sowas die OpenCV. Hab's bisher nur unter Windows ausprobiert, aber prinzipiell is die auch Plattformunabhängig.

Code: Alles auswählen

// Erzeuge Video Writer mit fixer FPS und Auflösung
CvVideoWriter videoWriter = cvCreateVideoWriter("output.avi", -1, fps, cvSize(width, height));

// TODO Loop over pixmaps
   
   QImage& img = pixmap.toImage();
   IplImage* image = cvCreateImageHeader(cvSize(img.width(), img.height()), IPL_DEPTH_8U, img.depth()>>3);
   image->widthStep = img.bytesPerLine();
   image->imageData = (char*) img.bits();	
   if (cvWriteFrame(m_videoWriter, image)!=1)
   {
      // error
   }
   cvReleaseImageHeader(&image);

// END LOOP

cvReleaseVideoWriter(&m_videoWriter);
So in etwa, je nach Implementierung natürlich etwas anders. Die Schleife für mehrere Pixmaps hab ich mir jetzt mal gespart

// EDIT
Hab grad nochmal in der Doku nachgeschaut:
cvCreateVideoWriter

Creates video file writer

typedef struct CvVideoWriter CvVideoWriter;
CvVideoWriter* cvCreateVideoWriter( const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1 );

filename
Name of the output video file.
fourcc
4-character code of codec used to compress the frames. For example, CV_FOURCC('P','I','M','1') is MPEG-1 codec, CV_FOURCC('M','J','P','G') is motion-jpeg codec etc. Under Win32 it is possible to pass -1 in order to choose compression method and additional compression parameters from dialog.
fps
Framerate of the created video stream.
frame_size
Size of video frames.
is_color
If it is not zero, the encoder will expect and encode color frames, otherwise it will work with grayscale frames (the flag is currently supported on Windows only).

The function cvCreateVideoWriter creates video writer structure.
D.h. der -1 Parameter klappt unter Linux wohl nicht, da muss man dann vermutlich den FOURCC Code des Codecs explizit angeben. Da ich hier aber kein Linux installiert hab, kann ich nicht mehr dazu sagen

Verfasst: 21. Dezember 2006 16:23
von darmstadt
Ja! Das klingt sehr toll. Ich werde es mal ausprobieren. (auch unter Linux und sage dann Bescheid was Sache ist).

Übrigens ist GStreamer noch nicht für c++.

Vielen vielen Dank!