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.
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.
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%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%Siehe auch
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.
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:
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.