2010-02-02 21 views
5

Tôi có một chương trình GUI Java swing hiển thị ở bất kỳ đâu trong khoảng từ 1 đến 25 khung hình/giây. Chỉ có một cửa sổ và chỉ một bảng điều khiển mà tôi thực hiện tất cả hiển thị, ví dụ: không có thành phần Swing nào khác.Tôi có thể tạo video của ứng dụng Java Swing đang chạy không?

Tôi cần có khả năng tạo video chạy thử nghiệm chương trình của mình khi chương trình chạy. Vấn đề là các công cụ tạo màn hình thông thường (ví dụ: các ứng dụng của bên thứ ba mà tôi bắt đầu trước khi chạy mã của mình) thường bỏ lỡ một số khung hình của tôi và tôi cần một video chính xác.

Tôi biết cách sử dụng lớp Robot để chụp ảnh chụp màn hình của cửa sổ Java, nhưng tôi không thể lưu chúng vào đĩa khi chạy, nó sẽ làm chậm mọi thứ xuống quá nhiều. Có cách nào cho tôi để sử dụng lớp Robot (hoặc có thể một số đoạn mã khác) để tạo một video của cửa sổ của tôi trên bay, trong khi chạy chương trình của tôi?

Cảm ơn!

Trả lời

4

Bạn có thể sử dụng trình bao bọc ffmpeg trong Java - Xuggler và được xây dựng trong lớp Java Robot. Đây là mã mẫu với Xuggler.

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

Tùy chọn khác là Screentoaster trang web - nhưng tôi lưu ý rằng tốc độ khung hình cung cấp.

0

Nếu bạn chạy chương trình của mình trong Linux, bạn có thể tận dụng lợi thế của recordmydesktop. Đây là một trong những chương trình ghi âm tốt hơn mà tôi đã sử dụng với các điều khiển trên tốc độ khung hình và không có gì.

+0

Rất tiếc, đang chạy trong Windows - cũng không thích lắm :) – Warlax

0

Bạn không thể điều chỉnh chương trình của mình để đổ nội dung của cửa sổ sau mỗi lần cập nhật cùng với dấu thời gian chính xác? Sau đó, đăng quá trình này vào một bộ phim nếu bạn cần điều đó.

Điều đó sẽ cho bạn toàn quyền kiểm soát.

+0

Thorbjørn, cảm ơn bạn đã trả lời nhanh. Tôi đã làm điều đó rồi, nhưng việc lưu tệp cho mỗi khung hình khá chậm. – Warlax

+0

Có vẻ như JMF hỗ trợ mã hóa một số định dạng video. Có thể là cách để đảm bảo video của bạn chính xác. http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/formats.html –

Các vấn đề liên quan