JMF screengrabber mit mauszeiger

Status
Nicht offen für weitere Antworten.

pattex

Mitglied
Ich habe ein einfaches Programm mit einem Paket von der Seite JMF Tools gebaut, um ein FullHD-Video von meinem Desktop aufzunehmen (Stichwort: Screengrabber). Soweit läuft es tadellos, nur wird der Mauszeiger nicht mit aufgenommen.

Habe selbiges auch bereits anderweitig versucht, etwa mit Screen Grabber. Alledings führt hierbei die hohe Auflösung zu einer OutOfMemoryError-Exception weil der Java HeapSpace zu klein ist, und es wird ebenfalls kein Mauszeiger mit aufgenommen.

:rtfm: Google liefert keine Tips wie ich den Mauszeiger abgreife/einbinde und ich selbst bin zu unerprobt mit dem JMF und Videobearbeitung im Allgemeinen...

Vielleicht weiß ja jemand spontan nen Rat...

LG,
Pattex

P.S.: Bin an das JMF gebunden, da es sich um ein Seminarthema handelt.
P.P.S.: Wenn nötig poste ich auch gern den Code.
 

lumo

Top Contributor
so spontan würd ich sagen...

da du einen screencast aufnimmst, wirst du wohl auch die position des cursors etwas hervorheben wollen (zb indem du einen gelben gefüllten kreis um deinen cursor legst (halbtransparent))

dazu würde ichs so machen... du machst nen screenshot (kein cursor)

dann zeichnest du deinen kreis und deinen cursor einfach auf die position, wo dein cursor ist (
Code:
MouseInfo.getPointerInfo().getLocation()
)

fertig.

wars das, was du gesucht hast?

ein schnelles beispiel-snipplet zum testen:

Code:
import java.awt.MouseInfo;

public class MousePos {
	public static void main(String[] args) {
		while (true) {
			System.out.println(MouseInfo.getPointerInfo().getLocation());
		}
	}
}

PS: der code zu dem programm würde mich interessieren, wenn das programm ein video draus macht?!
ich frage mich ob das dann mit DX un OGL auch funktioniert? schon getestet? (stichwort FRAPS / GameCam)
 
Zuletzt bearbeitet:

pattex

Mitglied
Ja richtig, den Cursor noch hervorzuheben wäre durchaus von Vorteil :toll:! Also würde ich quasi mit jedem Screenshot den ich in getNextImage() mache auch die Mausposition ermitteln, und in das BufferedImage an der entsprechenden Position einen Cursor (mit Kreis etc.) einzeichnen. Anschließend geb ich das modifizierte BufferedImage über return weiter, und habe im entstehenden Video meinen eigenen Mousecursor. Hm, klingt logisch, klingt einfach, funktioniert :applaus:

@Lumo: Ganz dickes Dankeschön! Hier mal der ganze Code. Nicht vergessen, JMF wird benötigt, und das Paket JMF Tools.

LG,
Pattex

Java:
import se.ikanos.video.BufferedImageProducer;
import se.ikanos.video.ImagesDataSource;
import se.ikanos.video.VideoRecorder;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;

/**
 * BufferedImageProducer zur Aufnahme von Desktop-Videos
 * @author Pattex
 */
public class ScreenGrabber implements BufferedImageProducer {
    private Robot robot;
    private Rectangle screenRect;
    private int count;
    private Image cursor;
    
    /**
     * Ein einfacher BufferedImageProducer, welcher durchweg Screenshots macht
     * @param grabSize Größe der aufzunehmenden Bildschirmfläche
     */
    public ScreenGrabber(Rectangle grabSize) throws AWTException {
    	cursor = Toolkit.getDefaultToolkit().getImage("c:/cursor.png");
    	screenRect = grabSize;
    	robot = new Robot();
    }

    /**
     * Holen der BufferedImages
     * @return Liefert das jeweils nächste BufferedImage bzw. null
     */
    public BufferedImage getNextImage() {
        if(count++ < 200) {
        	Point p = MouseInfo.getPointerInfo().getLocation();
        	BufferedImage frame = robot.createScreenCapture(screenRect);
        	Graphics2D g = frame.createGraphics();
        	g.drawImage(cursor, p.x, p.y, null);
        	g.dispose();
            return frame;
        }
        else {
            return null;
        }
    }

    /**
     * Holen des verwendeten Aufnahmeformats
     * @return Liefert das Aufnahmeformat als Dimension
     */
    public Dimension getGrabSize()  {
        return screenRect.getSize();
    }

    public static void main(String[] args) throws Exception {
        ScreenGrabber screenGrabber = new ScreenGrabber(new Rectangle(0, 0, 1920, 1080));
        ImagesDataSource imagesDataSource = new ImagesDataSource(screenGrabber, screenGrabber.getGrabSize(), 5);
        VideoRecorder.record(imagesDataSource, new File("c:/screenmovie.avi"));
    }
}
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben