2010-02-02 18 views
5

Saniyede 1 ila 25 kare arasında bir görüntü sağlayan bir Java swing GUI programım var. Sadece bir pencere ve tüm görüntülemeyi yaptığım yalnızca bir panel, ör. başka Swing bileşeni yok.Çalışan bir Java Swing uygulamasının videosunu anında yapabilir miyim?

Çalıştığım programın test çalıştırması videolarını hazırlayabilmem gerekiyor. Sorun, normal ekran döküm araçlarının (örneğin kodumu çalıştırmadan önce başladığım 3. parti uygulamaları) çoğu zaman çerçevelerimden bazılarını özlüyor ve doğru bir videoya ihtiyacım var.

Java penceremin ekran görüntülerini yakalamak için Robot sınıfını nasıl kullanacağımı biliyorum, ancak çalıştırdığımda bunları diske kaydetmem mümkün değil, her şeyi çok yavaşlatıyor. Programımı çalıştırırken penceremde bir video oluşturmak için Robot sınıfını (veya belki başka bir kod parçasını) kullanmamın bir yolu var mı?

Teşekkürler!

cevap

4

Java - Xuggler içinde ffmpeg sarıcısını kullanabilir ve Java Robot sınıfında yerleşik olarak kullanabilirsiniz. İşte Xuggler ile örnek kod.

final Robot robot = new Robot(); 
final Toolkit toolkit = Toolkit.getDefaultToolkit(); 
final Rectangle screenBounds = new Rectangle(toolkit.getScreenSize()); 

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

// 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, 
screenBounds.width, screenBounds.height); 

// Now, we're going to loop 
long startTime = System.nanoTime(); 
for (int index = 0; index < SECONDS_TO_RUN_FOR*FRAME_RATE.getDouble(); index++) 
{ 
    // take the screen shot 
    BufferedImage screen = robot.createScreenCapture(screenBounds); 

    // convert to the right image type 
    BufferedImage bgrScreen = convertToType(screen, 
    BufferedImage.TYPE_3BYTE_BGR); 

    // encode the image to stream #0 
    writer.encodeVideo(0,bgrScreen, 
    System.nanoTime()-startTime, TimeUnit.NANOSECONDS); 
    System.out.println("encoded image: " +index); 

    // 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(); 

Diğer bir seçenek Screentoaster sitesidir - ama ben o sağladıklarının kare hızı emin not edin.

0

Programınızı Linux'ta çalıştırıyorsanız, recordmydesktop'dan yararlanabilirsiniz. Çerçeveleme ve kontroller üzerinde kullandığım daha iyi kayıt programlarından biridir.

+0

Üzgünüz, Windows altında çalışan - pek beğenmedim :) – Warlax

0

Programınızı, her güncelleme sonrasında doğru bir zaman damgasıyla birlikte pencerenizin içeriğini dökümleyecek şekilde uyarlayamıyor musunuz? Sonra buna ihtiyacınız varsa bunları bir filme gönderin.

Bu size tam kontrol sağlayacaktır.

+0

Thorbjørn, hızlı cevap için teşekkürler. Bunu zaten yapıyordum, ancak her kare için bir dosya kaydetmek oldukça yavaş. – Warlax

+0

JMF, çeşitli video formatlarını kodlamayı destekler. Videonuzun doğru olduğu garantilenmek için bir yol olabilir. http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/formats.html –

İlgili konular