Repository navigation
RU RU Home
WATERMeDIA представляет собой библиотеку с мультимедийным API для воспроизведения, декодирования, кодирования и обработки видео, аудио и изображений. Если вы работали с ExoPlayer или VLCJ, она покажется вам знакомой, но здесь всё уже готово к работе: вам никогда не придётся возиться с буферами, плоскостями, порядком байтов или шагом данных (stride).
Она разрешает медиассылки (YouTube, Twitch, прямые файлы и многое другое), декодирует их и передаёт кадры вашему графическому движку (OpenGL, Vulkan, AWT, JavaFX), а звук вашему аудиодвижку (OpenAL, Java Sound). Изображения и анимации проходят через наши собственные декодеры на чистой Java; видео и аудио проходят через FFmpeg, который поставляется в сопутствующем моде WATERMeDIA: Binaries. Нужна Java 17 или новее.
Каждый пример в этом руководстве является фрагментом интеграции: переменные вроде renderThread,
renderExecutor или mrl берутся из вашего собственного кода.
Important
Эта схема не распространяется на экспериментальные API и внутренний код
Каждое число говорит, что изменилось и может ли это что-то сломать.
СХЕМА ПОВЫШЕНИЯ ВЕРСИИ
X.Y.Z-<channel>.W
-
X: Полное переписывание: всё, что вы знаете о библиотеке, выброшено и пересобрано с нуля -
Y: Ломающие изменения: рефакторинг, переименования и удаления API, которые могут сломать или точно сломают вашу реализацию -
Z: Хотфиксы, улучшения, новые API и аннотации устаревания, ничего ломающего. -
<channel>: Каналы ALPHA или BETA, релиз не использует этот суффикс версии- Примечание: иногда его намеренно опускают, потому что некоторые модлоадеры ломают с ним диапазоны версий.
-
W: Номер выпуска ALPHA или BETA, опускается на релизном канале
Это ГАРАНТИЯ того, что при повышении Z НЕ БУДЕТ НИКАКИХ ЛОМАЮЩИХ ИЗМЕНЕНИЙ, так что вы можете смело требовать
watermedia в диапазоне [3.0.1,3.1)
Выберите путь, который подходит под то, что вы создаёте.
- Подключение: добавьте зависимость и соблюдайте диапазон версий.
- Программные ограничения: поддерживаемые версии Minecraft и загрузчиков.
- Работа со ссылками: превратите ссылку в медиаисточники.
- Создание плеера и управление им.
- Выбор движков: OpenGL, Vulkan и OpenAL на собственных контекстах игры.
- Пространственный звук: позиционные экраны, стереопары и динамики.
- Синхронное воспроизведение: все плееры показывают один и тот же момент.
- Загрузка и скачивание файлов: делитесь файлами через файловый сервер.
- Подключение: зависимости Gradle, библиотеки времени выполнения и конфигурация.
- Запуск: запустите WATERMeDIA один раз и покажите экран загрузки.
- Работа со ссылками и поиск.
- Создание плеера и управление им и аудиодорожки.
- Выбор движков: AWT, JavaFX, OpenGL или Vulkan, плюс OpenAL или Java Sound.
- Диагностика и примеры.
Утилиты командной строки, боты, конвертеры и сервисы, которые работают без окна.
- Подключение и запуск: что нужно запускать, а что нет.
-
Платформы и поиск: разрешайте ссылки и ищите через
PlatformAPI, без всякого запуска. -
Скачивание:
NetRequestс ограничением размера и проверкой скачанного. - Декодеры и энкодеры: изображения, анимации и видеофайлы.
- Headless-движок: получайте декодированные кадры без графического контекста.
-
Синхронное воспроизведение:
ServerMediaPlayerработает и на серверах.
Прочитайте разделы запуск, публичные и внутренние пакеты, работа со ссылками, создание плеера и управление им и выбор движков, прежде чем писать код интеграции. Эти правила обязательны:
- Используйте только публичные пакеты (
org.watermedia,api.codecs,api.network,api.platform,api.player,api.util, без их подпакетов). Плееры и движки создаются только черезPlayerAPI; классы движков запечатаны (sealed). - Внутри Minecraft никогда не вызывайте
WaterMedia.start: это делает загрузчик. В остальных случаях вызывайте его один раз на процесс и никогда из колбэка или рабочего потока WATERMeDIA. Остановки нет. - Проверяйте
WaterMedia.loaded()и нужную вам возможность (например,CodecsAPI.ffmpegLoaded()), а не считайте их доступными заранее. - Разрешение асинхронно: опрашивайте
mrl.status()из тика и никогда не вызывайтеmrl.await(...)в игровом потоке или потоке рендеринга. -
PlayerAPI.player(...)может вернуть null. Освобождайте плеер, когдаstart()бросает исключение или хост убирает поверхность. - Передавайте движки как поставщики (supplier), никогда не делите один движок между плеерами и оставьте владение ими плееру.
- Читайте
player.texture()заново при каждой отрисовке, в потоке рендеринга; 0 означает, что рисовать нечего. - Никогда не вызывайте
release()из слушателя статуса или потока воспроизведения и освобождайте каждый плеер до уничтожения контекста OpenGL, Vulkan или OpenAL, который он использует. - Исполнитель (executor) OpenGL работает в потоке GL, и его задачи нужно выполнять каждый кадр, а также ещё раз после
release(). OpenAL требует, чтобы его контекст был текущим в каждом потоке, который управляет звуком. На Vulkan держитеqueueLock()вокруг своих собственных submit и present и никогда не вызывайтеvkDeviceWaitIdle, пока существуют плееры. - Слушатели статуса расходуются при переходе в
STOPPED,ENDEDилиERROR; чтобы продолжать слушать, зарегистрируйте слушатель заново из колбэка. - Булевы методы управления возвращают
true, когда вызов сработал, иfalse, когда он был отклонён; проверяйте результат, а не предполагайте. - Время указывается в миллисекундах (временные метки энкодера в микросекундах), громкость от 0 до 100, а скорость от чуть больше 0 до 4.
-
ImageReader.next()переиспользует свой буфер: скопируйте его до следующего вызова. Вызовы decode, reader, sniff и encoder изCodecsAPIэкспериментальные: не используйте их в модах; а его проверки статуса безопасны. - На выделенных серверах доступны
ServerMediaPlayer,PlatformAPI, загрузки черезNetworkAPI, файловый сервер и кодеки изображений на чистой Java; плееры и движки там бросают исключение.