Могу ли я сделать видео работающего приложения Java Swing на лету? - PullRequest
5 голосов
/ 03 февраля 2010

У меня есть программа Java Swing GUI, которая рендерит где-то между 1 и 25 кадрами в секунду. Это только одно окно и только одна панель, на которую я делаю рендеринг, например, других компонентов Swing нет.

Мне нужно, чтобы у меня была возможность создавать видео тестовых прогонов моей программы во время ее работы. Проблема заключается в том, что обычные инструменты приведения экрана (например, сторонние приложения, которые я запускаю до запуска своего кода) часто пропускают некоторые из моих кадров, и мне нужно точное видео.

Я знаю, как использовать класс Robot для захвата скриншотов моего окна Java, но я не могу сохранить их на диск во время работы, это слишком сильно замедлит все. Могу ли я использовать класс Robot (или, возможно, какой-то другой фрагмент кода) для создания видео моего окна на лету во время работы моей программы?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 03 февраля 2010

Вы можете использовать оболочку ffmpeg в Java - Xuggler и встроенный класс Java Robot .Вот пример кода с 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();

Другой вариант - Screentoaster сайт - но я уверен, что частоту кадров он обеспечивает.

0 голосов
/ 03 февраля 2010

Не можете ли вы адаптировать свою программу для вывода содержимого вашего окна после каждого обновления вместе с точной отметкой времени? Затем опубликуйте их в фильме, если вам это нужно.

Это даст вам полный контроль.

0 голосов
/ 03 февраля 2010

Если вы просто хотите сохранить визуальные изменения, вы можете использовать программное обеспечение для защиты экрана:

Ограничитель скриншотов с открытым исходным кодом: http://www.donationcoder.com/Software/Mouser/screenshotcaptor/index.html (или просто используйте обычный alt + print screen, ctrl v для каждого состояния) Каппер видео с открытым исходным кодом: http://camstudio.org/

0 голосов
/ 03 февраля 2010

Если вы запускаете свою программу в Linux, вы можете воспользоваться recordmydesktop .Это одна из лучших программ для записи, которую я использовал для управления частотой кадров и еще чем-то подобным.

...