Инструктивный документ по видео проигрывателю
Оглавление
-
- Введение в видео проигрыватель
-
- Функционал видео проигрывателя
-
- Обзор архитектуры видео проигрывателя
-
- Как использовать видео проигрыватель
-
- Подробная документация API проигрывателя
-
- Концепция упаковки проигрывателя
-
- Примеры отображения проигрывателя
-
- Добавление пользовательского представления
-
- Оптимизация работы видео проигрывателя
-
- Запись проблем с проигрывателем
-
- Оптимизация производительности и размер библиотеки
-
- Просмотр логов видео проигрывателя
-
- Описание ошибочных кодов библиотеки
-
- Серия wiki документов для данной библиотеки
-
- Журнал обновлений версий### 00. Универсальная архитектура видео проигрывателя
- Базовая упаковка видео проигрывателя
player
, которая позволяет свободно переключаться между ExoPlayer
, MediaPlayer
, RTC видео проигрывателем от Agora
и native MediaPlayer
- Для изменения состояния представления и последующего расширения возможностей, чтобы избежать связывания функций и бизнес-процессов. Например, требуется поддержка высокой степени кастомизации UI проигрывателя, а не его реализации внутри этой библиотеки
- Для функций воспроизведения видео, аудио, воспроизведения обратного потока, переключения между звуком и видео. Простое использование, сильная способность к расширению кода, хорошее упаковывание, основной целью является полное отделение от бизнес-процессов, предоставление интерфейсов слушателей для разработчиков для управления конкретными бизнес-логиками
- Архитектура данного проигрывателя состоит из следующих частей: ядро проигрывателя (свободное переключение) + видео проигрыватель + буферизация во время воспроизведения + высоко кастомизируемый уровень представления проигрывателя
01. Описание видео плеера| Функции плеера | MediaPlayer | ExoPlayer | IjkPlayer | RTC | TXPlayer |
|---------------------|-------------|-----------|-----------|----|----------|
| Разделение UI/Плеера/Бизнеса | Поддерживается | Поддерживается | Поддерживается | | |
| Переключение режима воспроизведения видео | Поддерживается | Поддерживается | Поддерживается | | |
| Соответствие видео при смене источника | Поддерживается | Поддерживается | Поддерживается | | |
| Изменение скорости воспроизведения | Поддерживается | Поддерживается | Поддерживается | | |
| Наблюдение за сетью | Поддерживается | Поддерживается | Поддерживается | | |
| Пролистывание для изменения яркости/громкости | Поддерживается | Поддерживается | Поддерживается | | |
| Установка пропорций воспроизведения видео | Поддерживается | Поддерживается | Поддерживается | | |
| Лёгкий переход между ядрами воспроизведения видео | Поддерживается | Поддерживается | Поддерживается | | |
| Запись положения воспроизведения | Поддерживается | Поддерживается | Поддерживается | | |
| Переключение режима четкости | Поддерживается | Поддерживается | Поддерживается | | |
| Автоматическое включение гравитационного сенсора | Поддерживается | Поддерживается | Поддерживается | | |
| Функция блокировки экрана | Поддерживается | Поддерживается | Поддерживается | | |
| Ускоренное воспроизведение | Неподдерживаемое | Поддерживается | Поддерживается | | || Минимальное окно воспроизведения видео | Поддерживается | Поддерживается | Поддерживается | | |
| Минимальное окно воспроизведения списка | Поддерживается | Поддерживается | Поддерживается | | |
| Воспроизведение и кэширование одновременно | Поддерживается | Поддерживается | Поддерживается | | |
| Воспроизведение нескольких видео одновременно | Поддерживается | Поддерживается | Поддерживается | | |
| Прогрузка как в Douyin | Поддерживается | Поддерживается | Поддерживается | | |
| Плеер без UI на основе ядра | Поддерживается | Поддерживается | Поддерживается | | |
| Добавление анимированного текста (danmu) | Поддерживается | Поддерживается | Поддерживается | | |
| Отображение зарядки аккумулятора в полноэкранном режиме | Поддерживается | Поддерживается | Поддерживается | | |
| Запись положения воспроизведения локально | Поддерживается | Поддерживается | Поддерживается | | |
02. Возможности видео проигрывателя| Тип | Описание функции |
| -------- | ------------------- |
| Проектная структура | VideoCache — библиотека кэширования, VideoKernel — библиотека видео-ядра, VideoPlayer — библиотека UI для видео, VideoSqlLite — вторичный кэш местоположения видео, VideoView — библиотека плавающего окна для видео, VideoM3u8 — библиотека для загрузки m3u8 и объединения |
| Ядро | MediaPlayer, ExoPlayer, IjkPlayer, в будущем будут добавлены Rtc и TXPlayer |
| Протоколы/форматы | http/https, concat, rtsp, hls, rtmp, file, m3u8, mkv, webm, mp3, mp4 и другие |
| Изображение | Настройка соотношения сторон отображения: по умолчанию, 16:9, 4:3, заполнение; поворот изображения во время воспроизведения (0°, 90°, 180°, 270°); зеркальный поворот |
| Макет | Ядро и UI разделены, отличается от большинства проигрывателей GitHub, что позволяет легко настраивать через addView |
| Воспроизведение | Обычное воспроизведение, воспроизведение в мини-окне, воспроизведение списка, воспроизведение как в TikTok |
| Пользовательская настройка | Можно добавлять пользовательский слой UI для видео, можно сказать, что UI и Player сильно разделены, поддерживаются пользовательские слои рендеринга SurfaceView |
| Унифицированный мониторинг видео | Удобство использования для начала воспроизведения видео пользователями, выхода, ошибок, завершения воспроизведения, а также прогресс при выходе, кликов рекламы, пробного просмотра и других унифицированных метрик || Запись местоположения воспроизведения видео локально | Локальное хранение местоположения воспроизведения видео с помощью двухуровневого кэша: кэш памяти + кэш жесткого диска + ключевой кэш + конфигурация размера, типа и пути кэша |### 03. Описание структуры видео проигрывателя
3.1 Структурная диаграмма видео проигрывателя

3.2 Классификация представлений плеера
- Общие макеты представлений видео
- Дно видео (для отображения обложки при инициализации видео), представление состояния воспроизведения видео [загрузка, сбой воспроизведения, неудачная загрузка видео, завершение воспроизведения и т. д.]
- Представление изменения яркости и звука [представление изменения звука, представление изменения яркости], изменение скорости перемотки вперед и назад, представление горизонтальной прокрутки вперед и назад (указатель перемотки при жестах)
- Верхнее представление области управления (включает кнопку возврата, заголовок и т. д.), нижняя область управления (включает полосу прогресса, управление воспроизведением/паузой, время, переключение полноэкранного режима и т. д.)
- Макет экрана блокировки (отображается во время полноэкранного режима, скрывается в других случаях), нижний макет полосы прогресса воспроизведения (многие плееры имеют этот макет), список макетов четкости (макет выбора четкости)
- Возможные макеты представлений в будущем - Макет страницы руководства по жестам (некоторые плееры имеют функцию новичкового руководства), макет интерфейса офлайн-скачивания (этот интерфейс включает список скачивания, редактирование элементов списка (выбор всех, удаление))
- Интерфейс сетевого соединения (когда пользователь переходит с Wi-Fi на 4G), макет уведомления о смене сети (отображается, когда сеть переходит с Wi-Fi на 4G)
- Макет представления рекламы изображения (с обратным отсчетом до исчезновения), макет начального видео-рекламы, макет просмотра пробной версии для неплатящих пользователей
- Макет чата (очень важен), макет отображения водяного знака, макет управления скоростью воспроизведения (для контроля скорости воспроизведения), нижний макет миниатюр списка видео
- Макет представления видео для проектора, макет представления стримингового видео, макет представления уроков преподавателя, макет представления дополнительных возможностей (скачивание, разделение, переключение аудио и т. д.)
3.3 Проблемы с проигрывателем
-
Сложность замены ядра проигрывателя
- Из-за различий в API различных видео проигрывателей, замена одного ядра на другое является сложной задачей. Для обеспечения совместимости при смене ядер, требуется создание собственного проигрывателя со своим набором видеоинтерфейсов и реализаций.
-
Зависимость ядра проигрывателя от уровня UI - Это означает, что видео проигрыватель и операции с пользовательским интерфейсом тесно связаны, особенно при взаимодействии между ними. Например, обновление полосы прогресса во время воспроизведения или отображение ошибочного UI при возникновении проблем — всё это усложняет управление состоянием проигрывателя.
-
Сложность кастомизации UI
- Например, в обычных видео проигрывателях различные виды представлений видео часто описываются в XML файлах. Такой подход приводит к увеличению объёма кода в дальнейшем, а маленькие изменения могут повлиять на весь проект. В результате, позже разработчики предпочитают добавлять новые компоненты,而不去删除旧的代码……
- Иногда сложно адаптироваться к новым требованиям, таким как добавление рекламы, проведение лекций или выполнение бизнес-требований по управлению видео. Это требует написания большого количества бизнес-кода внутри проигрывателя. Со временем это противоречит принципу открытости/закрытости, и проигрыватель должен быть отделён от бизнес-логики.
-
Неразбериха в структуре видео проигрывателя
- Это относится к тому, насколько легко можно быстро освоить работу с данным видео проигрывателем после чтения документации, поняв основные этапы его работы. Для удобства последующего изменения и обслуживания, следует разделить функциональные возможности проигрывателя.Например, разделение на ядро проигрывателя + контроллер + представление (player + controller + view)
3.4 Цели, достигаемые плеером- Цели и эффекты
- **Основной контейнер видео плеера** `player`, который позволяет свободно переключаться между ExoPlayer, MediaPlayer, Agora RTC video player core, native MediaPlayer.
- Для изменения состояния представлений и последующего обслуживания расширений, чтобы избежать связывания функциональностей и бизнес-логики. Например, требуется поддержка кастомизации UI плеера, а не встроенной в эту библиотеку.
- Поддержка функций воспроизведения видео, проигрывания видео, воспроизведения аудио, перемотки видео и прямого вещания видео.
-
Ядро плеера
- Возможность переключения между ExoPlayer, MediaPlayer, IjkPlayer, Agora video player с использованием шаблона "Фабрика" (
Factory
), абстрактного класса AbstractVideoPlayer
и конкретных реализаций этого абстрактного класса.
- Определение абстрактного плеера, который включает инициализацию видео, установку параметров, состояние и слушатель событий воспроизведения. Поскольку API каждого ядра плеера может различаться, здесь требуются реализации конкретных классов плеера от абстрактного класса
AbstractVideoPlayer
.
- Чтобы было удобнее создавать различные ядра плеера, используется
PlayerFactory
. Определяется метод createPlayer
для создания плеера, каждый тип ядра плеера реализует этот метод для создания своего плеера.- Видео плеер
- Возможность свободного переключения между различными ядрами плеера,
Player + Controller
. Player
отвечает за логику воспроизведения, а Controller
— за логику представлений. Между ними происходит взаимодействие через интерфейсы.
- Для
Controller
определяется интерфейс, который отвечает за обработку логики представлений UI, поддерживающий добавление различных кастомных представлений View
[все они должны реализовать интерфейс Control
]. Каждое представление должно обеспечивать простую функциональность, и затем добавляться через метод addView
.
- Для
Player
определяется интерфейс, который отвечает за обработку логики воспроизведения видео, такие как воспроизведение, пауза, установка прогресса воспроизведения, установка ссылки на видео, переключение режима воспроизведения и т.д. Важно передать Controller
в Player
, чтобы между ними происходил обмен данными через интерфейсы.- Контроллер представлений UI
- Определяется базовый класс
BaseVideoController
, который объединяет логику обработки различных событий, таких как изменение состояния плеера, управление скрытием/показом представлений, изменение прогресса воспроизведения, изменение состояния блокировки, мониторинг ориентации устройства и т. д.
- Определяется интерфейс
InterControlView
для представлений, где определяются методы для привязки представлений, управления скрытием/показом, состоянием воспроизведения, режимом воспроизведения, прогрессом воспроизведения и блокировкой экрана. Эти свойства доступны каждому реализующему класс.
- В
BaseVideoController
используется LinkedHashMap
, чтобы сохранять каждый пользовательский view. При добавлении нового view, он помещается в LinkedHashMap
, а затем через метод addView
добавляется в контроллер, что делает процесс добавления пользовательских view очень удобным.
- При смене состояния проигрывателя требуется изменение представления контроллера. Например, при возникновении ошибки видео необходимо отображать ошибочное представление view. Для взаимодействия между ними используется
ControlWrapper
(который реализует как интерфейс Controller, так и Player).
04. Как использовать видео плеер
4.1 Описание использования Gradle зависимостей
- Пример использования:
// Уровень UI для видео, обязательно указывать
implementation 'cn.yc:VideoPlayer:3.1.0'
``` // Кэширование видео; если не требуется, можно не указывать
implementation 'cn. yc:VideoCache:3.0.5'
// Ядро видео; обязательно указывать
implementation 'cn. yc:VideoKernel:3.0.6'
// Сохранение положения воспроизведения видео; выборочно добавляется
implementation 'cn. yc:VideoSqlLite:1.0.2'
```#### 4.2 Добавление макета в XML
- Внимание: во время реального разработки, из-за фрагментации Android устройств и множества разрешений экрана, рекомендуется гибко настраивать соотношение сторон макета как 4:3 или 16:9 или другое подходящее значение. Это можно сделать с помощью кода.
- При изменении соотношения сторон могут появиться черные полосы.
<org.yczbj.ycvideoplayerlib.player.VideoPlayer
android:id="@+id/video_player"
android:layout_width="match_parent"
android:layout_height="240dp"/>
4.3 Настройка базовых параметров видео плеера
- Пример использования:
// Создание базового видео контроллера, который обеспечивает основные функции плеера
BasisVideoController controller = new BasisVideoController(this);
// Установка контроллера
mVideoPlayer.setVideoController(controller);
// Установка URL для воспроизведения видео
mVideoPlayer.setUrl(url);
// Начало воспроизведения
mVideoPlayer.start();
```#### 4.4 Обратите внимание на следующие моменты
- Для полноэкранного воспроизведения необходимо указать соответствующие свойства активности в манифесте приложения
-
android:configChanges
гарантирует, что при переходе между горизонтальным и вертикальным режимами экрана воспроизведение видео не будет прервано
-
android:screenOrientation
фиксирует начальное положение экрана
- Эти два свойства контролируют ориентацию экрана при входе и выходе из полноэкранного режима
<activity android:name=".VideoActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"/>
- Чтобы видео началось воспроизводиться сразу после открытия страницы, достаточно небольшой задержки
- Пример кода ниже, обратите внимание, чтобы избежать вызова
start()
до завершения инициализации видео. . .
mVideoPlayer.postDelayed(new Runnable() {
@Override
public void run() {
mVideoPlayer.start();
}
}, 300);
4.5 О местном хранении позиции воспроизведения видео
- Обычные действия с позицией воспроизведения видео
- Лучше всего использовать серверное хранение позиции воспроизведения. Большинство видеоплееров сохраняет позицию воспроизведения на сервере, таким образом, пользователи могут продолжить просмотр с последней позиции даже при смене устройства или после переустановки программы.
- Почему возникла такая необходимость - В основном это связано с разработкой компанией нескольких специализированных образовательных приложений для планшетов. Поскольку сервер не имеет функции хранения позиции воспроизведения видео, а образовательные приложения продаются вместе с устройствами, вероятность смены устройства низкая. Поэтому было принято решение о локальном хранении позиций воспроизведения видео для выполнения задач.
-
Как проводится технический выбор
- Используется двухуровневое кэширование: кэширование в оперативной памяти и на жестком диске. Для кэширования на жестком диске первоначально рассматривались SQL, GreenDAO или Realm базы данных, но поскольку требуется создать универсальную библиотеку, её объём должен быть минимальным, она должна работать эффективно и не зависеть от сторонних библиотек. Поэтому для кэширования на жестком диске используется DiskLruCache. Подробнее см. документацию API. . .### 05. Детальное описание API для проигрывателя
-
- Самый простой способ воспроизведения
-
- Как менять ядро проигрывателя
-
- Меняем режим воспроизведения
-
- Меняем качество видео
-
- Отслеживание состояния воспроизведения видео
-
- Обработка воспроизведения в списке
-
- Воспроизведение в плавающем окне
-
- Другие важные функции API
-
- Воспроизведение нескольких видео
-
- API VideoPlayer
-
- API Controller
-
- Аналогично функционалу воспроизведения видео в Kuaishou
- Подробнее см. Документация API проигрывателя
06. Упаковка проигрывателя
6.1 Пример иерархии видео

6.2 Диаграмма процесса работы проигрывателя
6.3 Библиотека lib для проигрывателя

6.4 Описание библиотеки lib для ядра проигрывателя

6.5 Видеоплеер UI библиотека
07. Примеры отображения плеера












08. Добавление пользовательских представлений
- Как обеспечить совместимость с различными ядрами плеера
- Как обеспечить совместимость с различными ядрами плеера
- Оптимизация извлечения UI плеера
- Введение в принципы кэширования видео
- Глобальное отслеживание метрик видео плеера
- Оптимизация кода
- Об управлении типами заполнения видео. В этом репозитории представлено шесть различных типов, таких как нормальный по умолчанию; тип 16:9; тип 4:3; заполнение всего контейнера; центральное выравнивание и т.д., что аналогично установке масштабирования изображений. На самом деле это настройка размера
SurfaceView
...
- При просмотре обычного видео рекомендуется выбрать тип 16:9, так как после масштабирования будут видны черные полосы. Для видео типа "Кайф" или "Дуин", где каждый экран содержит одно видео, лучше выбрать заполнение всего контейнера, хотя видео будет обрезаться, но полностью заполняет экран.
- Проблемы при переходах между фоновым и передним планом
- При переходе из переднего в фоновый план, если видео воспроизводится или находится в режиме буферизации, вызывается метод пауза видео. При переходе из фонового в передний план, если видео находится в состоянии паузы или буферизации, вызывается метод возобновления воспроизведения видео. Также можно предоставить возможность пользователям самостоятельно нажимать кнопку воспроизведения.
- Проблемы изменения состояния строки состояния при работе плеера в обычном режиме и полноэкранном режиме
- Дополнительно требуется обработка "瀏海" (видимо, имеются в виду проблемы с вырезами в верхней части экрана смартфонов).### 11. Оптимизация производительности и размера библиотеки
13. Просмотр логов видео плеера
- Централизованное управление логами библиотеки для работы с видео плеером, что облегчает последующую диагностику проблем
- Например, для ядра видео, фильтр логов может быть таким: aaa
- Например, для видео плеера, фильтр логов может быть таким: bbb
- Например, для модуля кэширования, фильтр логов может быть таким: VideoCache
14. Описание кодов ошибок библиотеки
15. Серия wiki-документов библиотеки
16. Запись версионирования документов
17. Другие примечания
-
#### 17.1 Другие рекомендации
- Рекомендованные проекты
17.2 Благодарность за примеры использования и статьи
- ExoPlayer
- IJK Player
- AliCloud Player
- GSY VideoPlayer
- JiaoZi VideoPlayer
Copyright 2017 yangchong211 (github.com/yangchong211)
Разрешено к использованию в соответствии с Лицензией Apache, Версия 2.0 ("Лицензия").
Вы можете использовать этот файл только в соответствии с условиями Лицензии.
Вы можете получить копию Лицензии по адресу:
http://www.apache.org/licenses/LICENSE-2.0
Если применимое законодательство или письменное соглашение не требуют этого, программное обеспечение,
распределённое в рамках Лицензии, предоставляется «как есть», без каких-либо гарантий или условий любого типа,
выраженных или подразумеваемых.
Смотрите Лицензию для конкретного языка, регламентирующего права и ограничения, предоставленные Лицензией.
Комментарии ( 0 )