ERLEDIGT
JA
JA
ANTWORTEN
2
2
ZUGRIFFE
434
434
EMPFEHLEN
-
10.01.12 15:35 #1
- Registriert seit
- May 2008
- Ort
- NRW -> Düren -> Jülich
- Beiträge
- 61
Hallo liebe Community
Ich bin auf der Suche nach einer Möglichkeit mit Java 30 oder mehr Bildschirmfotos pro Sekunde zu machen.
Suche schon seid einiger Zeit aber habe bis jetzt nichts brauchbares gefunden. Nur immer wieder ansätze mit der getScreenCapture Funktion der Robot Klasse. Die ist aber effektiv VIEL zu langsam, damit komm ich grademal auf 5 Bilder pro Sekunde.
Habe schon versucht durch Threads die anzahl zu erhöhen, leider erfolglos.
Eine andere Möglichkeit als diese Robot Klasse scheint es nicht zu geben um einen Screenshoot zu erstellen. Ich finde zumindest keine, lasse mir aber auch liebend gerne eines besseren Belehren
Würde mich über ein paar Ideen die ich noch ausprobieren könnte sehr freuen.Mit freundlichen Grüßen
Windhund
-
10.01.12 17:52 #2
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
mit java.awt.Robot kann man in Verbindung mit einem schnellen JpegEncoder auf auf 25 Bilder / Sekunde kommen... wenn man mit dem Robot ein screen capture erstellt hat, darf man das nicht im selben Thread auf die Platte speichern, dass kostet zu viel Zeit. Hier bietet es sich an, die IO Operationen in eine Queue zu schreiben und diese asynchron von einem anderen Thread abarbeiten zu lassen....
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
package de.tutorials; import java.awt.AWTException; import java.awt.DisplayMode; import java.awt.GraphicsEnvironment; import java.awt.Rectangle; import java.awt.Robot; import java.awt.image.BufferedImage; import java.io.BufferedOutputStream; import java.io.Closeable; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; import static java.util.concurrent.TimeUnit.SECONDS; public class FastScreenShooterExample { public static void main(String[] args) throws Exception { try (ScreenGrabber sg = new AWTRobotScreenGrabber()) { int benchmarkPeriodInSeconds = 10; long endTime = System.currentTimeMillis() + SECONDS.toMillis(benchmarkPeriodInSeconds); int grabs = 0; while (System.currentTimeMillis() < endTime) { sg.grabAndOutput("d:/temp/screens", "screen" + grabs); grabs++; } System.out.printf("%s grabs/s", grabs / benchmarkPeriodInSeconds).println(); } } static interface ScreenGrabber extends Closeable { void grabAndOutput(String path, String imageName); } static abstract class AbstractScreenGrabber implements ScreenGrabber { protected Rectangle screenRect; protected ExecutorService imageWriterService; public AbstractScreenGrabber() { DisplayMode displayMode = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDisplayMode(); this.screenRect = new Rectangle(0, 0, displayMode.getWidth(),displayMode.getHeight()); this.imageWriterService = Executors.newSingleThreadExecutor(); } @Override public void grabAndOutput(String path, String imageName) { BufferedImage screenshot = grab(); write(screenshot, path, imageName); } protected abstract BufferedImage grab(); private void write(BufferedImage screenshot, String path, String imageName) { imageWriterService.submit(new WriteImageCommand(screenshot, path,imageName)); } @Override public void close() throws IOException { imageWriterService.shutdown(); } } static class AWTRobotScreenGrabber extends AbstractScreenGrabber { private Robot robot; public AWTRobotScreenGrabber() { try { this.robot = new Robot(); } catch (AWTException e) { throw new RuntimeException(e); } } @Override public BufferedImage grab() { return grab(this.screenRect); } public BufferedImage grab(Rectangle screenRect) { return robot.createScreenCapture(screenRect); } } static class WriteImageCommand implements Runnable { private final BufferedImage screenshot; private final String path; private final String imageName; public WriteImageCommand(BufferedImage screenshot, String path,String imageName) { this.screenshot = screenshot; this.path = path; this.imageName = imageName; } @Override public void run() { try (BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(new File(path, imageName + ".jpg")))) { //you have to disable the error for restricted / deprecated api ... JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bout); encoder.encode(screenshot); } catch (IOException e) { e.printStackTrace(); } } } }
Ansonsten schau mal hier:
http://www.tutorials.de/java/260004-...ung-corba.html
Eine weitere (eventuell schnellere) Möglichkeit wäre Screenshots regelmäßig mit einem Command Line Utility (http://superuser.com/questions/75614...ine-in-windows) zu erstellen, aber ich denke wenn man den Robot geschickt nutzt ist der schnell genug.
... wenn es hier um "richtige" Filme und keine bloßen Bilderfolgen gehen soll würde ich empfehlen zu ein Tool wie ffmpeg zu verwenden.
http://wiki.oz9aec.net/index.php/Hig...re_with_Ffmpeg
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
10.01.12 20:04 #3
- Registriert seit
- May 2008
- Ort
- NRW -> Düren -> Jülich
- Beiträge
- 61
Cool
Auf jedenfall schonmal vielen dank für die schnelle Antwort.
Werde mich mal durch den code und die Links durcharbeiten
Mit freundlichen Grüßen
Windhund
Ähnliche Themen
-
Screen-Aufnahme ("Bildschirmvideo")
Von Netos im Forum Videoschnitt, Videotechnik & -produktionAntworten: 4Letzter Beitrag: 03.07.10, 01:03 -
Neue Version des Java Plugins in Java SE 6 Update N Early Access
Von Thomas Darimont im Forum JavaAntworten: 0Letzter Beitrag: 01.05.08, 13:38 -
java.sun.com Artikel zeigt die neuen Features für Java on the Desktop von Java 6
Von Thomas Darimont im Forum Java Technology NewsAntworten: 1Letzter Beitrag: 17.02.07, 18:39 -
Java is Hot! Java News - Java Polis 2005
Von Thomas Darimont im Forum JavaAntworten: 0Letzter Beitrag: 03.12.05, 16:23 -
Rendering Performance von Java 2D / Swing verbessern unter Java 5
Von Thomas Darimont im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 0Letzter Beitrag: 06.02.05, 00:58





Zitieren

Login





