tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
2
ZUGRIFFE
434
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Windhund Windhund ist offline Mitglied Silber
    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

  2. #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ß Tom
     
    Java 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

  3. #3
    Windhund Windhund ist offline Mitglied Silber
    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

  1. Screen-Aufnahme ("Bildschirmvideo")
    Von Netos im Forum Videoschnitt, Videotechnik & -produktion
    Antworten: 4
    Letzter Beitrag: 03.07.10, 01:03
  2. Antworten: 0
    Letzter Beitrag: 01.05.08, 13:38
  3. Antworten: 1
    Letzter Beitrag: 17.02.07, 18:39
  4. Java is Hot! Java News - Java Polis 2005
    Von Thomas Darimont im Forum Java
    Antworten: 0
    Letzter Beitrag: 03.12.05, 16:23
  5. Rendering Performance von Java 2D / Swing verbessern unter Java 5
    Von Thomas Darimont im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 06.02.05, 00:58