2016-02-11 1 views
1

J'ai une application pour capturer la vidéo de l'écran et enregistrer dans un fichier. Je donne à l'utilisateur la possibilité de choisir entre 480, 720, et les tailles de vidéo "Plein écran". Un 480 enregistrera dans une petite case sur l'écran, 720 enregistrera dans une plus grande boîte, et bien sûr, "Full Screen" enregistrera dans une boîte encore plus grande. Cependant, cette boîte en plein écran n'est PAS la résolution d'écran réelle. C'est la taille de la fenêtre de l'application, qui se situe autour de 1700x800. L'outil vidéo fonctionne parfaitement pour les options 480 et 720, et fonctionnera également si "Plein écran" est écrasé pour être l'écran entier de 1920x1080.Cropping BufferedImage Pour une utilisation dans Xuggle encodeVideo

Ma question: Certaines tailles sont-elles autorisées? Est-ce que cela doit correspondre à un certain format ou être une résolution "acceptable"? Mon code, ci-dessous, est modifié à partir du fichier CaptureScreenToFile.java de xuggle (l'emplacement du problème est noté par les commentaires):

public void run() { 
     try { 
      String parent = "Videos"; 
      String outFile = parent + "example" + ".mp4"; 
      file = new File(outFile); 

      // This is the robot for taking a snapshot of the screen. It's part of Java AWT 
      final Robot robot = new Robot(); 
      final Rectangle customResolution = where; //defined resolution (custom record size - in this case, 1696x813) 

      final Toolkit toolkit = Toolkit.getDefaultToolkit(); 
      final Rectangle fullResolution = new Rectangle(toolkit.getScreenSize()); //full resolution (1920x1080) 

      // First, let's make a IMediaWriter to write the file. 
      final IMediaWriter writer = ToolFactory.makeWriter(outFile); 

      writer.setForceInterleave(false); 

      // We tell it we're going to add one video stream, with id 0, 
      // at position 0, and that it will have a fixed frame rate of 
      // FRAME_RATE.  
      writer.addVideoStream(0, 0, FRAME_RATE, customResolution.width, customResolution.height); //if I use fullResolution, it works just fine - but captures more of the screen than I want. 

      // Now, we're going to loop 
      long startTime = System.nanoTime(); 
      while (recording) {  
       // take the screen shot 
       BufferedImage screen = robot.createScreenCapture(fullResolution); //tried capturing using customResolution, but did not work. Instead, this captures full screen, then tries to trim it below (also does not work). 
       // convert to the right image type 
       BufferedImage bgrScreen = convertToType(screen, BufferedImage.TYPE_3BYTE_BGR); //Do I need to convert after trimming? 

       BufferedImage trimmedScreen = bgrScreen.getSubimage((int)customResolution.getX(), (int)customResolution.getY(), (int)customResolution.getWidth(), (int)customResolution.getHeight()); 

       // encode the image 
       try{ 
        //~~~~Problem is this line of code!~~~~ Error noted below. 
        writer.encodeVideo(0, trimmedScreen, System.nanoTime() - startTime, TimeUnit.NANOSECONDS); //tried using trimmedScreen and bgrScreen 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

       // sleep for framerate milliseconds 
       Thread.sleep((long) (1000/FRAME_RATE.getDouble())); 

      } 
      // Finally we tell the writer to close and write the trailer if 
      // needed 
      writer.close(); 
     } catch (Throwable e) { 
      System.err.println("an error occurred: " + e.getMessage()); 
     } 
    } 

    public static BufferedImage convertToType(BufferedImage sourceImage, int targetType) { 
     BufferedImage image; 

     // if the source image is already the target type, return the source image 
     if (sourceImage.getType() == targetType) 
      image = sourceImage; 
     // otherwise create a new image of the target type and draw the new image 
     else { 
      image = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), targetType); 
      image.getGraphics().drawImage(sourceImage, 0, 0, null); 
     } 

     return image; 
    } 

Erreur: java.lang.RuntimeException: ne pouvait pas flux ouvert com.xuggle. [email protected] [index: 0; id: 0; streamcoder: [email protected] [codec = [email protected] [type = CODEC_TYPE_VIDEO; id = CODEC_ID_H264; nom = libx264; ]; base de temps = 1/50; fréquence d'image = 0/0; type de pixel = YUV420P; largeur = 1696; hauteur = 813;]; framerate: 0/0; base de temps: 1/90000; direction: OUTBOUND;]: Opération non autorisé

Remarque: Le fichier a été créé avec succès, mais sa taille est zéro et ne peut pas être ouvert par Windows Media. a Player, avec le texte d'erreur suivant: Windows Media Player ne peut pas lire le fichier. Le lecteur peut ne pas prendre en charge le type de fichier ou ne pas prendre en charge le codec utilisé pour compresser le fichier.

Désolé pour la question verbeuse. Je suis intéressé à apprendre QUOI et POURQUOI, pas seulement une solution. Donc, si quelqu'un peut expliquer pourquoi cela ne fonctionne pas, ou me diriger vers du matériel pour aider, je l'apprécierais. Merci!

+1

essayer d'avoir la dimension même nombre 1696x812 – gpasch

+0

Wow, il est vraiment simple. Donc apparemment tout fonctionnait bien, il fallait juste de la logique pour éviter les nombres impairs dans les dimensions. Merci pour votre aide, si vous le mettez comme une réponse, je vais le marquer pour vous. – Tarm

Répondre

1

Essayez d'avoir la dimension même nombre 1696x812