title: Java - Xuggle - Best method to get a frame
body: <p>I'm working with xuggle since one week and I wrote a method to get a 
  frame by a video but if video is long this method takes too much time: </p>
  
  <pre><code>public static void getFrameBySec(IContainer container, int videoStreamId, IStreamCoder videoCoder, IVideoResampler resampler, double sec) 
  { 
      BufferedImage javaImage = new BufferedImage(videoCoder.getWidth(), videoCoder.getHeight(), BufferedImage.TYPE_3BYTE_BGR); 
      IConverter converter = ConverterFactory.createConverter(javaImage, IPixelFormat.Type.BGR24); 
      IPacket packet = IPacket.make(); 
      while(container.readNextPacket(packet) &gt;= 0) 
      { 
          if (packet.getStreamIndex() == videoStreamId) 
          { 
              IVideoPicture picture = IVideoPicture.make(videoCoder.getPixelType(), videoCoder.getWidth(), videoCoder.getHeight()); 
              int offset = 0; 
              while(offset &lt; packet.getSize()) 
              { 
                  int bytesDecoded = videoCoder.decodeVideo(picture, packet, offset); 
                  if (bytesDecoded &lt; 0) 
                      throw new RuntimeException("got error decoding video"); 
                  offset += bytesDecoded; 
                  if (picture.isComplete()) 
                  { 
                      IVideoPicture newPic = picture; 
                      if (resampler != null) 
                      { 
                          newPic = IVideoPicture.make(resampler.getOutputPixelFormat(), picture.getWidth(), picture.getHeight()); 
  
                          if (resampler.resample(newPic, picture) &lt; 0) 
                              throw new RuntimeException("could not resample video from"); 
                      } 
                      if (newPic.getPixelType() != IPixelFormat.Type.BGR24) 
                              throw new RuntimeException("could not decode video as RGB 32 bit data in"); 
  
                      javaImage = converter.toImage(newPic); 
                      try 
                      { 
                          double seconds = ((double)picture.getPts()) / Global.DEFAULT_PTS_PER_SECOND; 
                          if (seconds &gt;= sec &amp;&amp; seconds &lt;= (sec +(Global.DEFAULT_PTS_PER_SECOND ))) 
                          { 
  
                              File file = new File(Config.MULTIMEDIA_PATH, "frame_" + sec + ".png"); 
                              ImageIO.write(javaImage, "png", file); 
                              System.out.printf("at elapsed time of %6.3f seconds wrote: %s \n", seconds, file); 
                              return; 
                          } 
                      } 
                      catch (Exception e) 
                      { 
                          e.printStackTrace(); 
                      } 
                  } 
              } 
          } 
          else 
          { 
              // This packet isn't part of our video stream, so we just 
              // silently drop it. 
          } 
      } 
      converter.delete(); 
  } 
  </code></pre>
  
  <p>Do you know a better way to do this?</p>