Работа с видео (DVD, .avi .mkv) в Java - PullRequest
26 голосов
/ 12 января 2011

Обыскав приличную библиотеку для воспроизведения видео на Java, я отклеился.Все вокруг кричат ​​не использовать JMF, потому что он устарел, устарел и требует от пользователя его установки, другие альтернативы, такие как VLCJ, кажутся хорошими, если они работают, но все еще относительно нестабильны и полагаются на изрядное количество нативного кода, а также для работы сDVD, которые кажутся золотым песком в бесплатной библиотеке!

Текущие параметры:

  • Теперь JavaFX 2 набирает обороты, это то, на что я серьезно смотрел (поэтомумой вопрос здесь ) но мне пока не везет, когда я пытаюсь понять, как заставить его воспроизводить что-то большее, чем стандартное FLV-видео.
  • VLCJ хорошо работает для того, что он делает(см. мой текущий ответ), и на данный момент я иду вперед.Он использует libvlc, чтобы делать практически все, что угодно, так как он может воспроизводить практически любой файл, а также воспроизводить DVD из коробки.Большая проблема заключается в том, что вам нужно использовать несколько виртуальных машин для каждого игрока, чтобы заставить его работать стабильно, а это означает, что реакция относительно медленная.У меня также пока нет такого подхода к работе на Mac.
  • JMF смехотворно устарел, ужасен и, на мой взгляд, просто не вариант.Я играл с ним в прошлом, и опыт не был удачным!
  • FMJ говорит, что это замена JMF.Мне еще предстоит заставить его работать, как и большинство других людей, с которыми я разговаривал, и это само по себе устает от его качества и понимания, даже если мне удается заставить его работать!
  • Xuggler - этоотлично подходит для того, что он делает, у него есть блестящие учебники, и он очень хорошо написан.Но хотя это отлично подходит для низкоуровневой работы по транскодированию, воспроизведение видео и получение кадров в правильном порядке, в синхронизации и т. Д. - это просто кошмар для правильной работы, и снова добавляется больше кода, что означает больше обслуживания, потенциально больше ошибоки т.д. и т.п.Это тоже не вариант), и его поддержка кодеков не кажется самой широкой.
  • JCodec - интересное усилие, единственное, что я видел для реализации поддержки видео отчисто Java-перспектива - но в настоящее время поддержка форматов отсутствует, и это относительно новый проект.
  • Создание чего-либо самостоятельно в отдельной нативной библиотеке для каждой платформы, которую я хочу поддерживать.Это абсолютный вариант последней инстанции из-за дополнительного времени обслуживания и кодирования, которое для этого потребуется.

Исходя из вышеизложенного (или чего-либо еще, что вы можете придумать), какие варианты люди рекомендуют и какиеЕсть ли другие разумные, которые я пропустил?Или другие люди думают, что они могут появиться в ближайшем будущем?

Ответы [ 7 ]

11 голосов
/ 02 августа 2011

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

Ксугглер был великолепен, но, к сожалению, слишком низкий уровень для меня - огромное количество изобретений колеса (и того хуже), необходимых только для того, чтобы начать воспроизведение с поиском работы, немного оттолкнуло меня;Я чувствовал, что это займет вечность, чтобы решить все проблемы с этим.Для кодирования / транскодирования / других низкоуровневых видео работ, хотя я бы искренне рекомендовал это - лучше всего без сомнений.

Предостережения с моим выбранным подходом?Что ж, если внешние виртуальные машины не будут отключены явно, они продолжат воспроизведение видео в фоновом режиме даже после завершения работы приложения, и отладка становится все труднее при таком подходе.Я также еще не проверял, что он работает на Mac, и мое первоначальное предложение, вероятно, не потому, что из того, что я слышал, MacOS не позволяет одному процессу контролировать окно другого без явного разрешения с помощью собственного кода.Это должно быть возможно, если немного поработать.

Как побочный эффект от проекта, над которым я сейчас работаю, я могу посмотреть, смогу ли я обернуть всю эту функциональность вне процесса в простой Javaвидео каркас, который использует VLCJ под.Если кому-то это будет интересно (я не могу ничего обещать, кроме того, что чем больше интерес, тем больше у меня шансов поработать над этим), не стесняйтесь, дайте мне знать!

Итак, после моего исследования иВыводы, я бы рекомендовал использовать VLCJ (но определенно с использованием проигрывателей вне процесса), если вы просто хотите воспроизводить / записывать / передавать потоковое видео, и Xuggler, если вы хотите работать с любым видео низкого уровня ссами кодеки.На момент написания статьи просто не было хорошего, чистого Java-решения, и, вероятно, оно останется таким какое-то время - к счастью, хотя можно получить достойные результаты с кроссплатформенными нативными библиотеками.Это просто требует гораздо больше работы!

2 голосов
/ 17 января 2011

Я использовал jffmeg в некоторых своих проектах (ffmeg java bindings), поэтому до сих пор не сталкивался с какими-либо проблемами. http://jffmpeg.sourceforge.net/documentation.html. Я также использовал qt-jambi, но никогда не пробовал его библиотеку видео (фононов), это также может решить вашу проблему.

1 голос
/ 18 января 2011

Я могу порекомендовать привязки gstreamer-java . Как следует из названия, он оборачивает API GStreamer в классы Java. Таким образом, вы получаете доступ к графическим возможностям обработки мультимедиа, которые предоставляет GStreamer. Это может быть очень удобно, если вы хотите выполнять более сложные задачи, такие как транскодирование.

Также, если я правильно помню, был коммерческий плагин для GStreamer, который поддерживал воспроизведение DVD и шел с лицензией на CSS. Если это не имеет значения для вашего варианта использования, вы всегда можете пойти и с открытым исходным кодом (единственный, который мне когда-либо был нужен).

1 голос
/ 15 января 2011

Попробуйте Xuggler, он включает в себя известные библиотеки FFmpeg в Java.

1 голос
/ 15 января 2011

Вы пытались использовать API-интерфейсы JavaFX?.

На мой взгляд, JavaFX включает поддержку воспроизведения H.264 ... и здесь кто-то показывает, как воспроизводить видео в новом открытом окне Googleисходный WebM / VP8

http://javafxplace.blogspot.com/2010/06/javafx-and-webm-on-linux.html

1 голос
/ 12 января 2011

Я бы согласился остаться в стороне от JMF.Особенно, если вы хотите проигрывать DVD.Даже JMF полагается на собственный код для некоторых его функций.Вы, вероятно, в любом случае не избавитесь от каких-то нативных зависимостей.Еще одним вариантом будет FMJ.Это версия JMF с открытым исходным кодом.Хотя мне не очень повезло с этим.

Мое предложение было бы пойти с VLCJ.Я изучал это, когда мне нужно было медиа решение.К сожалению, он выпущен под лицензией GPL, поэтому я не могу использовать его в своем приложении, но, похоже, он сможет справиться с тем, что вы хотите.

Кроме того, другой мой пост может быть вам интересен. Ссылка

Кроме того, этот может быть полезен.

0 голосов
/ 14 июля 2018

В настоящее время я использую библиотеку OpenImaj http://openimaj.org/tutorial, которая имеет

XuggleVideo and XuggleAudio class

. Я бы посоветовал вам использовать это и реализовать собственные механизмы потоков для их воспроизведения.В настоящее время я работаю над медиаплеером, надеясь, что он хорошо воспроизведет «популярные» видеоформаты, поскольку

VideoDisplay class

в библиотеке хорошо справляется, но воспроизведение довольно прерывистое, и библиотекареализовано с учетом Swing и присоединение

ImageComponent 

к узлу Swing, по-видимому, не работает по какой-то причине в JavaFx, но сейчас я могу получить их изображения из видео, и я надеюсь,мне повезло с этим.

...