ScreenVideo кодировщик в Java

Кто-нибудь знает о бесплатном кодировщике видео Java для ScreenVideo (v1 или v2)? Я знаю, что у ffmpeg есть версия C ++, а Ли Феларка написал ее на AS3; но мне бы очень хотелось иметь такой на Java.
AS3: http://www.zeropointnine.com/blog/assets_code/SimpleFlvWriter.as.txt


person Paul Gregoire    schedule 06.09.2010    source источник
comment
Итак, чтобы получить награду, насколько мне известно, я хотел бы, чтобы это был чистый java-код. Нет JNI, JNA и т. Д.   -  person Paul Gregoire    schedule 01.10.2010
comment
Я запустил чистую версию java, которую вы можете увидеть здесь: pastebin.com/X1cGeHat, но так и не закончил.   -  person Paul Gregoire    schedule 01.10.2010
comment
К вашему сведению, я наградил @Andy наградой за его ссылку на кодировщик Java BBB, а не за блок кода захвата экрана.   -  person Paul Gregoire    schedule 08.10.2010
comment
Спасибо! И я как бы подумал, учитывая ваши первоначальные комментарии относительно ваших поисков чистой реализации java.   -  person Andy    schedule 08.10.2010


Ответы (4)


Я считаю, что библиотека Xuggle делает то, что вы хотите, хотя на самом деле это может быть оболочка вокруг собственных библиотек, таких как ffmpeg.

Вот фрагмент кода, кодирующего скриншоты рабочего стола в формате flv (mp4):

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

Этот код взят из руководства на веб-сайте Xuggle.

Более продвинутое кодирование, также на веб-сайте Xuggle здесь.

Если вам нужна собственная оболочка, выполните поиск в Интернете по запросу " IContainerFormat flv " для других фрагментов примера кода.

Кроме того, уже существует очень похожий вопрос


Обновление: собственная реализация java.

Ознакомьтесь с ScreenVideoEncoder.java из проекта bigbluebutton на github.

person Andy    schedule 01.10.2010
comment
Хороший ответ, но Xuggle является родным, он предоставляет доступ к ffmpeg через JNI. Я ищу чистый Java-код. - person Paul Gregoire; 01.10.2010
comment
Кстати, ваш образец кода не кодируется в screenvideo или для ffmpeg flashsv. Результатом этого кода, скорее всего, будет h.264 в контейнере mp4. - person Paul Gregoire; 02.10.2010
comment
Я не очень знаком с экранным видео, можете ли вы дать ссылку на дополнительную информацию? Поиск в Google только по этому слову мало что дает. - person Andy; 04.10.2010
comment
И да, Xuggle, похоже, является оболочкой для собственных библиотек, но это лучшее, что у меня есть. Я также нашел еще одну собственную оболочку, но она использует JMF api, поэтому она может быть более идеальной, если в конечном итоге вы сможете использовать собственную реализацию: fobs.sourceforge.net Если вы не можете использовать нативную библиотеку, я думаю, вы можете быть SOL (если, конечно, вы не напишете свою собственную реализацию). - person Andy; 04.10.2010

Вернер Рандельшофер разместил в своем блоге программу записи с экрана на чистом языке Java и любезно опубликовал источник: http://www.randelshofer.ch/blog/2011/05/pure-java-screen-recorder/ Похоже, вы делаете то, что хотите.

person Ben    schedule 01.08.2011
comment
Не уверен, что кодек Вернера такой же или еще нет, посмотрю. Это кодек, к которому относится вопрос wiki.multimedia.cx/index.php? title = Flash_screen_video - person Paul Gregoire; 02.08.2011

Я считаю, что BigBlueButton реализовал один, но я не знаю, открыли ли они его исходный код. Проверить там.

person Art Clarke    schedule 02.10.2010

Я не знаю, найдете ли вы что-нибудь хорошее, написанное на чистой Java без использования нативного кода. Кодирование видео - очень трудоемкая задача, поэтому обычно оно пишется с помощью «быстрого» нативного кода на таких языках, как C или даже Assembler. При кодировании видео часто используются специальные инструкции ЦП и ГП для повышения скорости - все это недоступно в Java, поэтому нет смысла писать на Java кодировщики видео для промышленного использования. На вашем месте я бы просто взял какое-нибудь нативное решение и встроил его с помощью JNI, JNA или Swig (популярные соединители Java-to-native). Если вам нужна высокая переносимость (например, 32-битная Windows, 64-битная Windows, 32-битная Linux, 64-битная Linux), просто скомпилируйте эту собственную библиотеку для этих четырех платформ и вставьте в свои JAR-файлы. Если вам просто нужно написать несжатое видео, это легко сделать на Java, и это будет так же быстро, как собственный код. Просто возьмите этот SimpleFlvWriter.as, который вы разместили, и перепишите его на Java - это не должно быть сложной задачей.

person iirekm    schedule 08.10.2010