Wie mache ich schnell einen Screenshot von Desktop mit Java in Windows (ffmpeg, etc.)?

8

Ich möchte Java verwenden, um einen Screenshot meines Rechners mit FFMPEG oder einer anderen Lösung zu erstellen. Ich weiß, dass Linux mit ffmpeg ohne JNI funktioniert, aber es in Windows nicht funktioniert und erfordert (JNI?) Gibt es ein Beispiel für eine einfache Java-Klasse (und alles andere notwendig), um einen Screenshot in einer Windows-Umgebung ausführen zu können? Gibt es eine Alternative zu FFMPEG? Ich möchte den Screenshot schneller aufnehmen als die Java Robot API, von der ich herausgefunden habe, dass sie bei der Erstellung von Screenshots arbeitet, aber langsamer als ich möchte.

Ich weiß, unter Linux funktioniert das sehr schnell:

%Vor%

Dies funktioniert nicht in Windows-Umgebung. Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, den gleichen Code zu verwenden, aber benutze javacpp, um es wirklich funktionieren zu lassen, ohne viel von dem obigen Code ändern zu müssen.

Ziel ist es, Screenshots des Bildschirms schnell zu machen, aber dann zu stoppen, nachdem es einen Screenshot, der "anders" ist, aka. Der Bildschirm wurde aufgrund eines Ereignisses wie Fenster, Fenster geschlossen usw. geändert.

    
Setsuna 10.07.2014, 04:16
quelle

4 Antworten

25

Die Verwendung der integrierten Robots-Klasse ist wesentlich einfacher als bei anderen Java-Bibliotheken und sollte wahrscheinlich Ihren Anforderungen entsprechen.

Wenn Sie ein flüssiges Video mit & gt; = 30fps (mehr als 30 Screenshots pro Sekunde) benötigen, sollten Sie zuerst den Robots-Ansatz plus Leistungsverbesserungen mit asynchroner Speicherung der Screenshots ausprobieren.

Wenn es nicht für Sie funktioniert, versuchen Sie es mit JNA und das ist (obwohl es komplexer ist) fast garantiert für eine reibungslose Bildschirmaufnahme.

Annäherung mit Robotern

Die Robots-Klasse ist in der Tat in der Lage, das zu tun, was Sie wollen. Das Problem, das die meisten Screenshots mit Robots haben, ist das Speichern der Screenshots. Ein Ansatz könnte folgendermaßen aussehen: Looping über die captureScreen () -Methode, indem Sie den Bildschirm in ein BufferedImage aufnehmen, in ein Byte-Array konvertieren und mit einem asynchronen Datei-Writer in einer Zieldatei speichern, nachdem Sie die zukünftige Referenz Ihres Bildes hinzugefügt haben ArrayList, um beim Speichern der Bilddaten weitermachen zu können.

%Vor%

Annäherung mit JNA

Ursprüngliche Frage: Wie können Screenshots in Java schnell erstellt werden?

Da es eine schlechte Übung ist einfach zu verlinken, werde ich das Beispiel hier veröffentlichen:

%Vor%

Weitere Informationen und Ansätze

Siehe auch

1337 14.07.2014, 13:43
quelle
1

Sie müssen JNI oder JNA verwenden, um eine Kombination von CreateCompatibleBitmap, XGetImage, DirectX oder OpenGL aufzurufen, um einen Screenshot zu erstellen und dann einige unbearbeitete Bitmap-Daten zurück nach Java zu kopieren. Meine Profilerstellung zeigte eine Beschleunigung von etwa 400% gegenüber der Robot-Klasse beim Zugriff auf rohe Bitmap-Daten auf X11. Ich habe zu diesem Zeitpunkt noch keine anderen Plattformen getestet. Ein sehr früher Code ist hier verfügbar, aber ich hatte in letzter Zeit nicht viel Zeit, daran zu arbeiten.

    
Alex Barker 11.07.2014 00:15
quelle
0

Kennen Sie Xuggler? Es verwendet FFmpeg zum Kodieren und Dekodieren. Ich habe es vor ein paar Monaten kennen gelernt, als ich Frames aus einem Video extrahieren musste und es reibungslos funktionierte.

Auf der offiziellen Website finden Sie einige Beispiele, darunter "CaptureScreenToFile.java". Für weitere Informationen folgen Sie diesen Links:

Ссылка

Ссылка

    
H3LL0 18.07.2014 16:34
quelle
0

Laut der offiziellen ffmpeg Dokumentation sollten Sie in der Lage sein, es ziemlich plattformübergreifend zu halten, wenn Sie den% Der Parameter co_de%, der an die Variable file übergeben wird (was wirklich ein Parameter FFmpegFrameGrabber ist, der als Option input an ffmpeg weitergegeben wird), gilt für die verschiedene Formate pro -i erwartet .

ie:

für Windows: device erwartet dshow

für OSX: -i video="screen-capture-recorder" erwartet avfoundation

und für Linux: -i "<screen device index>": erwartet x11grab .

Diese Werte (Argumente an -i :<display id>+<x>,<y> ) einfach an den Konstruktor zu übergeben und das Format (via -i ) entsprechend einzustellen, sollte den Trick machen.

    
Roberto Andrade 04.03.2015 21:41
quelle

Tags und Links