Воспроизведение видео на Java ( JMF, Fobs4JMF, Xuggler, FMJ)
Мне нужно простое воспроизведение видео на Java.
Вот мои требования:
КАЧЕСТВО ПРОДУКЦИИ
Открывайте и декодируйте видео файлы, видео и аудио кодеки которых я могу выбрать. То есть я могу выбрать хорошо ведущие себя кодеки.
Уметь воспроизводить, приостанавливать, искать кадр или искать и останавливать воспроизведение. По сути, я хочу иметь возможность воспроизводить сегменты одного видеофайла нелинейным способом. Например, я могу захотеть воспроизвести отрезок от 20,3 с до 25,6 с, сделать паузу на 10 секунд, а затем воспроизвести отрезок с 340,3 до 350,5 с и т. Д.
Во время воспроизведения видео и аудио должны быть синхронизированы.
Видео должно отображаться в Swing JComponent.
Должен быть в состоянии использовать в коммерческом продукте, не будучи открытым исходным кодом (IE LGPL или Comercial это хорошо)
Мои исследования привели меня к следующим решениям:
- Используйте Java Media Framework + Fobs4JMF http://fobs.sourceforge.net/f4jmf_first.html
Я реализовал быстрый прототип, и это, кажется, делает то, что мне нужно. Я могу воспроизвести сегмент видео, используя:
player.setStopTime(new Time(end));
player.setMediaTime(new Time(start));
player.start();
Хотя Fobs4JMF, кажется, работает, я чувствую, что качество кода низкое, и проект больше не активен. Кто-нибудь знает какие-либо продукты, которые используют Fobs4JMF?
- Напишите приложение Flash, которое воспроизводит видео, и используйте JFlashPlayer, чтобы перенести его в мое приложение Java Swing.
В отличие от Java, Flash великолепно воспроизводит видео. Я мог бы написать небольшое приложение Flash с методами:
open(String videoFile),
play(),
pause(),
seek(int duration),
stop()
Затем перенесите его в Java, используя JFlashPlayer, который может вызывать функции Flash из Java.
Что мне нравится в этом решении, так это то, что воспроизведение видео во Flash должно быть безупречным. Кто-нибудь использовал JFlashPlayer для воспроизведения видео на Java?
- Напишите простой медиаплеер поверх Xuggler
Xuggler - это обертка FFMpeg для Java, которая представляется довольно активным и высококачественным проектом. Однако реализация простого воспроизведения видео, описанного в требованиях, не является тривиальной (особенно в поиске), но некоторая работа была проделана в MediaTools MediaViewer, который послужил бы основой для построения.
- Используйте FMJ
Я пытался заставить FMJ работать, но пока безуспешно.
Буду признателен за ваше мнение по моей проблеме.
5 ответов
На мой взгляд, VLCJ - это путь вперед для такого рода вещей. Я люблю Xuggler за работу по кодированию / транскодированию, но, к сожалению, так просто сделать простое воспроизведение и решить все проблемы с синхронизацией и тому подобное - и очень хочется заново изобретать колесо, делая это.
Единственное, что есть в VLCJ, - это чтобы он работал надежно с несколькими игроками, к которым мне приходилось прибегать к игрокам вне процесса. Фреймворк не был самой простой вещью в мире, которую можно установить, но когда она там работает, она прекрасно работает. В настоящее время я использую 3 вне процесса игроков в моем приложении бок о бок без каких-либо проблем.
Другое предостережение в том, что встроенный медиаплеер не будет работать с компонентом Swing, а только с тяжеловесным холстом, но для меня это совсем не проблема. Если это произойдет, то вы можете использовать прямой медиаплеер, чтобы получить буферизованное изображение и отобразить его на том, что вы выберете, но оно будет поглощать ваш процессор немного больше (хотя не больше, чем другие игроки, которые используют этот подход).
JavaFX имеет ряд встроенных видео и аудио кодеков. Вероятно, это будет решение с самой широкой поддержкой на данный момент.
Я использовал jffmpeg так же, как вы используете FOBS, он работает довольно хорошо, хотя я не сравнивал их.
Я также хотел бы увидеть простой способ взаимодействия с нативными кодеками, как это делает JavaFX, но между JavaFX и Java, похоже, нет реальной интеграции.
Также была проделана некоторая работа по переводу библиотеки VLC libvlc в java. Я еще не пробовал, и было бы интересно услышать от кого-то, кто имеет.
Я бы рекомендовал использовать MPV. Вы можете легко использовать его в сочетании с JavaFX, см. Этот пример.
Короче говоря, вы используете небольшую магию JNA для прямого использования собственных библиотек MPV, а затем позволяете отображать видео на сцене JavaFX. Если вы используете дочерний этап, вы даже можете наложить элементы управления JavaFX поверх видео (с полной поддержкой прозрачности).
VLC (с VLCJ) можно использовать аналогичным образом, но я считаю, что решение MPV работает лучше (более быстрое время поиска и запуска).