Могу ли я на лету снять видео о работающем приложении Java Swing?

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

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

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

Спасибо!


person Warlax    schedule 02.02.2010    source источник


Ответы (4)


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

person cetnar    schedule 02.02.2010

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

person TheBuzzSaw    schedule 02.02.2010
comment
Извините, работает под Windows - тоже не очень нравится :) - person Warlax; 03.02.2010

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

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

person Thorbjørn Ravn Andersen    schedule 02.02.2010
comment
Торбьёрн, спасибо за быстрый ответ. Я уже делал это, но сохранять файл для каждого кадра довольно медленно. - person Warlax; 03.02.2010
comment
Похоже, JMF поддерживает кодирование нескольких видеоформатов. Возможно, это способ гарантировать точность вашего видео. java.sun.com/javase/technologies/ рабочий стол / медиа / jmf / 2.1.1 / - person Thorbjørn Ravn Andersen; 03.02.2010

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

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

person sibidiba    schedule 02.02.2010