Video Herstellung

Alles rund um die Programmierung mit Qt
Antworten
darmstadt
Beiträge: 46
Registriert: 18. April 2006 09:33

Video Herstellung

Beitrag 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.
ess
Beiträge: 1
Registriert: 21. Dezember 2006 14:18

Beitrag 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.
darmstadt
Beiträge: 46
Registriert: 18. April 2006 09:33

Beitrag 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
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag 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
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
darmstadt
Beiträge: 46
Registriert: 18. April 2006 09:33

Beitrag 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!
Antworten