Skip to content

Видеоплеер — Обзор функциональности

Документ описывает возможности встроенного видеоплеера, построенного на базе better_player (обёртка над Flutter video_player) с интеграцией audio_service для фонового воспроизведения.


Основное воспроизведение

ФункцияОписание
HLS-адаптивный стримингСетевые источники используют ASMS-треки с адаптивным переключением битрейта.
Локальное (офлайн) воспроизведениеPlayableSource.local позволяет воспроизводить загруженные файлы с диска.
Фоновая аудиосессияVideoBackgroundHandler наследует BaseAudioHandler; интегрируется с AudioService и AudioSession для управления воспроизведением в фоне и с экрана блокировки.
Управление через уведомления AndroidЭлементы управления (воспроизведение, пауза, перемотка, пропуск) отображаются в канале уведомлений Android. Компактные кнопки адаптируются в зависимости от позиции в очереди.
Автовозобновление прогрессаПри открытии видео плеер перематывает к последней сохранённой позиции (прогресс сохраняется для каждого медиа-элемента). Видео, просмотренные на ≥ 97%, начинаются сначала.
Обработка ошибок и повторПри сбое воспроизведения отображается VideoPlaybackFailedWidget с кнопкой повтора или закрытия в зависимости от наличия сети.

Управление воспроизведением

Элемент управленияДетали
Воспроизведение / ПаузаЦентральная кнопка с индикатором загрузки при буферизации.
Перемотка вперёд / назад (кнопки)Выделенные кнопки перемотки в оверлее управления.
Двойной тап для перемоткиДвойное нажатие на левую или правую половину области видео для перемотки без открытия оверлея (DoubleTapRewindWidget).
Полоса прогрессаКастомная перетаскиваемая полоса прогресса в стиле Cupertino с индикатором буферизации.
Переход к следующему видеоКнопка «вперёд» отображается при наличии следующего непросмотренного видео в плейлисте. Уже завершённые видео пропускаются.

Плейлист и очередь

ФункцияОписание
Плейлист курсаЗагружается для каждого курса; отображается в нижней интерактивной панели. Поддерживает выбор видео по индексу.
Плейлист избранногоОтдельный плейлист избранного, загружаемый параллельно с основной очередью.
Ленивая подгрузка следующей страницыПри приближении к концу текущего плейлиста следующая порция элементов загружается автоматически (getNextPlaylist).
АвтовоспроизведениеПереключатель в настройках. При включении следующее видео запускается автоматически после завершения текущего. При отключении вместо этого срабатывает интерактивная панель или экзаменационный флоу.

Настройки (с сохранением)

Все настройки сохраняются через PlayerSettingsStorage (SharedPreferences) и восстанавливаются при следующем сеансе.

НастройкаЗначения
Скорость воспроизведения0.75×, 1× (Обычная), 1.25×, 1.5×, 1.75×, 2×
Качество видеоАвто или конкретное разрешение (например, 720p, 1080p) из ASMS-треков.
СубтитрыВкл / Выкл — управляет отображением субтитров.
АвтовоспроизведениеВкл / Выкл — управляет автоматическим переходом к следующему видео.

Субтитры

  • Субтитровые дорожки загружаются из HLS-манифеста (useAsmsSubtitles: true).
  • При инициализации плеер автоматически выбирает субтитры, соответствующие локали приложения (_setupSubtitlesByLocale).
  • Субтитры отображаются в кастомном оверлее (VideoPlayerSubtitlesPresenter), который скрывается при перетаскивании полосы прогресса и когда видны элементы управления.
  • Видимость субтитров переключается пользователем и сохраняется между сеансами.

Картинка в картинке (PiP)

  • Поддерживается на iOS (нативный AVPlayer PiP) и Android (android_pip).
  • Кнопка PiP в верхних элементах управления плеера.
  • При входе в PiP: полноэкранный плеер скрывается, интерактивные панели закрываются, навигация возвращается к корневому маршруту.
  • При выходе из PiP: полноэкранный плеер восстанавливается с оверлеем, воспроизведение продолжается.
  • PiP разрешён для каждого медиа индивидуально через PlayableMedia.allowPIP.

AirPlay (iOS)

  • Кнопка выбора маршрута AirPlay отображается только на iOS (flutter_to_airplay).
  • Активная трансляция обозначается жёлтым цветом иконки.
  • При выходе из PiP во время AirPlay-трансляции воспроизведение автоматически возобновляется на устройстве AirPlay.
  • CurrentRouteNotifier отслеживает, транслируется ли видео на внешний дисплей.

Масштабирование щипком (интерактивное видео)

  • InteractiveVideo оборачивает плеер в InteractiveViewer с поддержкой масштабирования от minScale (вписать по размеру) до .
  • Масштаб возвращается к вписыванию или заполнению с анимированными переходами и тактильной обратной связью.
  • При первом использовании показывается Lottie-анимация обучения масштабированию, которая автоматически исчезает через 6 секунд.
  • Изменение ориентации сбрасывает уровень масштабирования.

Закладки

ФункцияОписание
Создание закладкиКнопка закладки в верхних элементах управления открывает AddBookmarkDialog с текстовым полем ввода. Воспроизведение приостанавливается, пока диалог открыт.
Закладки на полосе прогрессаСозданные закладки отображаются жёлтыми маркерами на полосе прогресса (BookmarksOnProgressBar).
Уведомление о создании закладкиПосле сохранения закладки отображается снэкбар с подтверждением.
Зависимость от сетиКнопка закладки отображается только при наличии сетевого подключения.

Таймер сна

ФункцияОписание
Таймер по времениПользователь выбирает часы и минуты через колёсный пикер. По умолчанию: 15 минут.
Режим «до конца видео»Переключатель для автоматической остановки воспроизведения по окончании текущего видео.
Экран обратного отсчётаАктивный таймер отображает нижний лист с обратным отсчётом.
Состояние таймера при пропускеЕсли таймер в режиме «до конца видео» и пользователь переключает видео, таймер перезапускается для нового видео.

Аннотации видео

  • Аннотации загружаются для каждого видео через AnnotationsBloc после инициализации видео.
  • Типы аннотаций определяются VideoAnnotationTypeId и рендерятся через AnnotationPresenterFactory.
  • Система поддерживает различные типы аннотаций, используемые в лекциях:
    • Аннотации лекций
    • Навигация к следующей лекции
    • Навигация к следующему саммари
    • Запросы обратной связи / оценки курса
    • Аннотации-ссылки
    • Аннотации-лайки
    • Аннотации с формами

Интерактивная панель и интеграция с экзаменами

ФункцияОписание
Оверлей интерактивной панелиВыдвижная панель (PlayerInteractiveBoxWidget), которая может отображать: плейлист, избранное или контент экзамена.
Запуск экзамена из плеераКогда автовоспроизведение выключено и видео заканчивается, плеер проверяет доступность экзамена и может перенаправить на экзаменационный флоу.
Переход к симуляторуЕсли у видео есть возможность обратной связи (canAddFeedback), плеер перенаправляет на страницу симулятора при закрытии.
Материалы курсаВ нижних элементах управления отображается кнопка материалов — разблокирована после прохождения экзамена, заблокирована в остальных случаях.
Оценка курсаКубит оценки курса, запускаемый в рамках интерактивной панели.

Отслеживание вовлечённости и аналитика

  • SummaryEngagementDispatcher отслеживает время просмотра каждого видео с помощью секундомера.
  • Отправляет VideoPlayerEngagementEvent каждые 5 секунд во время воспроизведения.
  • При смене медиа или закрытии плеера отправляет VideoPlayerEngagementCompletedEvent с общей, максимальной за саммари и сегодняшней продолжительностью.
  • VideoPlayerSummaryWatchThresholdEvent срабатывает при пересечении настраиваемого порога прогресса просмотра (из remote config).
  • WatchTimeController отслеживает накопительное время просмотра, сбрасывается при переключении видео.

Ориентация и полноэкранный режим

ФункцияОписание
АвтоориентацияПлеер устанавливает ориентацию устройства на основе соотношения сторон видео при открытии.
Развернуть / СвернутьКнопка переключения полноэкранного режима в правом нижнем углу элементов управления.
Ландшафтный поворотНа мобильных устройствах (не планшетах) контент приложения поворачивается, когда плеер в ландшафтном режиме.
Системный UIСистемные оверлеи (статус-бар, панель навигации) скрываются, пока плеер виден, и восстанавливаются при закрытии.
Блокировка ориентации при открытых листахНижние листы (таймер, настройки) временно блокируют ориентацию для предотвращения проблем с вёрсткой.

Плееры трейлеров

Отдельные облегчённые реализации плееров для трейлеров:

РасположениеОписание
Трейлер на экране курсаВстроенный трейлер на странице детальной информации о курсе с кастомными элементами управления.
Трейлер главной подборкиПлеер трейлера в главной подборке на домашнем экране.
Управление трейлеромУпрощённые элементы управления с поддержкой субтитров (TrailerPlayerControls, TrailerSubtitlesPresenter).

Фоновая работа и жизненный цикл

ФункцияОписание
Блокировка экранаЭкран остаётся активным во время воспроизведения видео (WakeLockController).
Обработка аудиопрерыванийInterruptionListener ставит на паузу и возобновляет воспроизведение при аудиопрерываниях (звонки, другие приложения).
Учёт жизненного циклаОбрабатывает изменения AppLifecycleState — восстанавливает ориентацию PiP при возобновлении.
Очистка кэшаКэш плеера очищается при переключении видео и при закрытии плеера.

Архитектура (обзор)

AfiVideoPlayerController (координатор)
├── VideoBackgroundHandler (движок воспроизведения + AudioService)
   └── BetterPlayerController
├── VideoPlayerOverlayController (видимость элементов управления и автоскрытие)
├── VideoPlayerProgressController (перемотка и перетаскивание)
├── VideoPlayerLoadingController (состояние буферизации)
├── VideoPlayerVisibleController (показ / скрытие плеера)
├── VideoPlayerPipController (режим PiP)
├── VideoPlayerOrientationController (управление ориентацией)
├── VideoPlayerSubtitleController (состояние субтитров)
├── PlayerTimerCubit (таймер сна)
├── PlayerInteractiveBoxController (оверлей-панель: плейлист, избранное, экзамен)
├── PlaylistBloc + PlaylistProvider (состояние и данные плейлиста)
└── FavoritesPlaylistBloc (состояние плейлиста избранного)

Виджет VideoPlayerOverlay оборачивает всё приложение как глобальный оверлей, позволяя плееру отображаться поверх всех экранов. Он объединяет экземпляр BetterPlayer, слои управления, отображение субтитров, систему аннотаций, закладки и интерактивную панель в единый координированный стек.

Авторы

The avatar of contributor named as melvspace melvspace

История