"screenshot-film" ?..
-
Hi,
Ich möchte auf Linux von einem Programm einen kurzen Film aufnehmen, so wie ein screenshot, nur eben ein Film statt nur ein Bild.
Wie könnte ich das anstellen? Gibts da gute Software dafür?
-
broadcast2000 kann meines wissens bildschirmbereiche capturen und dann speichern. allerdings ist broadcast von der bedienung und vom look'n'feel sehr gewöhnungsbedürftig...
-
// X Server #include <X11/Xlib.h> #include <X11/Xutil.h> // X shared-mem extension #include <sys/shm.h> #include <X11/extensions/XShm.h> class screengrabber { public: screengrabber(int x, int y, uint width, uint height); ~screengrabber(void); // Größe des BGRA buffers uint GetScreenBufferSize(void) { return imagesize; } // Grabbt den Bereich (width, height) an x, y und gibt den Pointer auf den BGRA-Buffer zurück uchar* Grab(int x =0, int y =0); private: // X resourcen Display* display; Screen* screen; XImage* image; XShmSegmentInfo shminfo; uint imagesize; };
namespace sys { screengrabber::screengrabber(int x, int y, uint width, uint height) { display = XOpenDisplay(0); screen = DefaultScreenOfDisplay(display); runl << "XDisplay opened" << endl; //extension checken if(!XShmQueryExtension(display)) Err("SHARED MEMORY NOT SUPPORTED"); //depth checken if(DefaultDepth(display, DefaultScreen(display)) != 24) Err("24 BIT DEPTH NEEDED"); //shared image mit format bgra[width][height] erzeugen image = XShmCreateImage(display, DefaultVisual(display, DefaultScreen(display)), 24, ZPixmap, NULL, &shminfo, width, height ); if(!image) Err("XShmCreateImage failed"); else runl << "Shared XImage created" << endl; imagesize = image->bytes_per_line * image->height; //shared mem mit zugriffsrechten shminfo.shmid = shmget( IPC_PRIVATE, imagesize, IPC_CREAT|0777 ); if(shminfo.shmid == -1) Err("shmget failed"); char* mem = (char*)shmat(shminfo.shmid, 0, 0); shminfo.shmaddr = mem; image->data = mem; shminfo.readOnly = False; runl << "Shared memory allocated" << endl; if(XShmAttach(display, &shminfo) == 0) Err("XShmAttach failed"); // es muss mindestens einmal gegrabbt werden Grab(x, y); } screengrabber::~screengrabber(void) { if(image) { XShmDetach(display, &shminfo); image->data = 0; XDestroyImage(image); image = 0; runl << "Shared XImage destroyed" << endl; shmdt(shminfo.shmaddr); shmctl(shminfo.shmid, IPC_RMID, 0); runl << "Shared memory deallocated" << endl; } XCloseDisplay(display); runl << "XDisplay closed" << endl; } //oder AllPlanes für alle rgbA 0xFFFFFF uchar* screengrabber::Grab(int x, int y) { if(XShmGetImage(display, RootWindow(display, DefaultScreen(display)), image, x, y, 0x00FFFFFF ) == 0) { runl << "XShmGetImage failed" << endl; return 0; } return (uchar*)image->data; } }// sys
Edit: Includes vergessen
-
Danke fuer die Antworten
Hab das mittlerweile so hingebogen, dass ich in der (OpenGL-)Applikation selbst ne Funktion habe, die jedes Frame auch als bmp ausgibt. Diese Bmps setz ich dann zu nem Film zusammen.
-
Das kann ich nicht empfehlen!
Daten über den AGP-Bus anzufordern fürht zu einem Lag das sogar ms-Ausmaße annehmen kann (AGP-Flush).
Ich würde immer die Funktionen des Window-Systems nutzen.