Одной из основных частей приложения, так или иначе работающего с видео, является видеоплеер. Если вы хотя бы раз имели дело с интеграцией плеера в своё приложение, то наверняка знаете, что его настройка и кастомизация занимает определённое время. Также мы готовы поспорить, что чаще всего вам не нужен был плеер, который играл бы только одно видео за всё время работы с приложением. В большинстве случаев вы бы хотели использовать плейлисты. В этой статье мы хотим рассказать вам о разработанном нами открытом компоненте, который мы используем для воспроизведения видео в нашем проекте Together. Речь пойдёт о плеере плейлистов DVPlaylistPlayer.
Yet Another Video Player?
Очень часто при разработке нового плеера с нуля вам приходится проделывать все те же самые действия, что и в прошлый раз, и в позапрошлый, и много раз до этого. Каждый раз вам нужно устанавливать observer для того, чтобы отслеживать начало и конец воспроизведения, каждый раз приходится писать одни и те же методы для работы с громкостью и так далее.
Так как наша команда iOS-разработки в основном занимается созданием приложений, использующих видеоплеер, мы часто оказываемся в подобной ситуации. И это подтолкнуло нас к созданию простого универсального компонента — плеера плейлистов на основе стандартного AVPlayer.
Нашей целью являлось предоставление вам (и себе заодно) простой и гибкой заготовки в виде плеера в готовом для работы виде, включающего необходимый минимум функций. В нём уже реализованы все необходимые для воспроизведения компоненты и методы, поэтому вам ничего не придётся делать вручную для того, чтобы он проигрывал видео из плейлистов. Если вам нужен простейший видеоплеер, считайте, что он уже у вас есть, встраивайте в приложение, задавайте ему видео — и готово! Плеер обладает набором всех стандартных плеерных возможностей — play, stop, pause, next, previous, а также изменение громкости и возможность отключить/включить звук (mute/unmute).
Однако и в том случае, если вам нужно подстраивать поведение плеера под свои нужды или добавить к нему новую функциональность — вы сможете это сделать без проблем. В публичный интерфейс плеера плейлистов выведен AVPlayer, лежащий в его основе. Поэтому если вы захотите научить свой плеер чему-то новому, вы всегда сумеете это сделать, напрямую доработав этот компонент.
Устройство плеера
При создании универсального компонента, который к тому же должен обеспечивать высокий уровень кастомизации, необходимо, чтобы элемент, лежащий в его основе, был весьма гибким. В среде iOS разработки существует всего две заготовки плеера, которые можно положить в основу создания видеоплеера своей мечты. Это MPMoviePlayerController из фреймворка Media Player и AVPlayer из AVFoundation. Как вы могли узнать из нашей статьи «Воспроизведение видео в iOS-приложениях», где было проведено сравнение вышеуказанных компонент, MPMoviePlayerController не обладает какими-либо выдающимися способностями к кастомизации. AVPlayer же, напротив, буквально создан для того, чтобы быть в основе собственноручно созданного плеера. Сам по себе он малопригоден для работы, но, будучи правильно настроенным, является очень удобным и предоставляет весьма широкие возможности для использования и настройки под свои требования.
Исходя из вышесказанного, в качестве воспроизводящей видео основы нами был выбран плеер AVPlayer. Затем был создан класс DVAudioSession для работы со звуком. Он опирается на работу MPMusicPlayerController и AudioSession из фреймворка AudioToolbox. В качестве отдельного UIView для передачи на него изображения из плеера нами был создан класс DVPlaylistPlayerView. Вы можете включить его в свою иерархию видов в качестве основного окна плеера. Этот UIView доступен из основного класса DVPlaylistPlayer по свойству playerView.
Наш плеер отличается от других нестандартным подходом к взаимодействию с плейлистом. В большинстве случаев плейлист представляет собой массив единиц контента для воспроизведения, который передаётся прямо в плеер. В нашем случае вместо того, чтобы хранить в себе массив AVPlayerItem’ов, плеер получает видео через метод своего data source, подобно UITableView. Таким образом, плеер при начале воспроизведения нового видео вызывает метод queuePlayer:playerItemAtIndex:, а вы в свою очередь должны обеспечить корректную передачу объекта класса AVPlayerItem в этом методе. Такое разделение делает работу с плейлистом весьма гибкой, так как позволяет как угодно менять и перетасовывать плейлист прямо во время его воспроизведения. Плеер, в свою очередь, не хранит ненужный ему массив данных, таким образом занимая меньше памяти. Источник данных для плеера должен реализовывать протокол DVPlaylistPlayerDataSource.
События процесса воспроизведения, такие как начало проигрывания, конец проигрывания, остановка плеера и т.д. вы можете получать через делегат, реализующий протокол DVPlaylistPlayerDelegate. Вот полный список событий, о которых вы можете получать оповещения.
-
Начало проигрывания.
-
Пауза.
-
Возобноление проигрывания.
-
Остановка (после вызова метода stop).
-
Остановка после проигрывания видео до конца.
-
Переключение на следующее видео.
-
Переключение на предыдущее видео.
-
Началась буферизация плеера.
-
Отключение звука (mute).
-
Включение звука (unmute).
-
Изменение громкости.
-
Ошибка воспроизведения.
Для получения событий о буферизации видео (в том случае, если оно располагается не локально) используется observer, установенный на свойство playbackLikelyToKeepUp. Для этого была использована библиотека THObserversAndBinders. Также THObserver был использован для оповещения об установке плеера на паузу, продолжения воспроизведения, начала и остановки воспроизведения.
Установка плеера
Итак, вы заинтересовались и хотите подключить плеер к своему проекту. Простейший способ установки плеера — через CocoaPods. Если вы уже используете CocoaPods в своём проекте, просто добавьте строчку
pod ‘DVPlaylistPlayer’, :git=>’https://github.com/denivip/DVPlaylistPlayer’в свой Podfile. Затем необходимо выполнить команду
pod updateв терминале. Плеер будет добавлен к списку используемых компонент.
Если вы ещё не начали пользоваться CocoaPods, то вам следует создать файл с именем Podfile в корневой директории проекта, затем добавить в него следующие строки
platform :ios, ‘5.0’ pod ‘DVPlaylistPlayer’, :git=>’https://github.com/denivip/DVPlaylistPlayer’Вместо версии 5.0 можно использовать другую версию iOS, в зависимости от конкретного проекта. Однако следует иметь в виду, что для работы плеера нужна версия iOS не ниже 5.0!
Затем вы просто выполняете в терминале команду
pod installПлеер будет установлен в папку с вашим проектом. Также будет установлена библиотека THObserversAndBinders, которая используется в плеере. Не забудьте теперь использовать файл *.xcworkspace вместо *.xcodeproj для работы над своим приложением.
Если по какой-либо причине вы не хотите использовать CocoaPods в своём проекте, то просто скачайте git-репозиторий плеера. В папке DVPlaylistPlayer находятся исходные коды плеера. Теперь вы можете легко подключить их к проекту просто скопировав в XCode.
Использование плеера
Ниже приведён пример использования плеера.
[gist id=5966011 bump=1]
Для использования плеера нужно создать объект класса DVPlaylistPlayer (строка 1).
Затем нужно добавить изображение с плеера в иерархию видов (строка 2).
Добавляем делегата и data source для плеера, предварительно создав их экземпляры и реализовав необходимые методы (строки 3-4).
Запускаем плеер, начиная проигрывание с первого видео (строка 6), или с любого другого по вашему желанию.
***
Мы надеемся, что наш плеер поможет вам в создании видео-приложений и будет гибким, функциональным и полезным дополнением к вашему проекту. Призываем вас вместе совершенствовать и развивать плеер — сообщайте нам о найденных ошибках, или высказывайте свои соображения по улучшению.
Ссылка на github — https://github.com/denivip/DVPlaylistPlayer .