Привет, Хабр! Меня зовут Игорь, я занимаюсь мобильной разработкой в компании ГРИ, часть холдинга Sunlight(еще не закрылись). Сегодня хочу поделиться опытом создания плеера для воспроизведения плейлистов в форматах m3u и m3u8.

Истоки идеи

Несколько лет назад, когда доступ к футбольным трансляциям был ограничен дорогостоящими подписками или большим количеством рекламы, я начал пользоваться сервисом, который предлагал широкий выбор каналов за символическую плату. Для просмотра предоставлялся файл в формате m3u8. На iOS возможности для просмотра плейлистов в этом формате были ограничены: доступные приложения или были платными, или полны рекламы, которую показывали по несколько раз за сессию. Проблемы возникли и с VLC плеером, который не смог распарсить файл, предложенный сервисом, а OttPlayer временно исчез из App Store (хотя сейчас он снова доступен). Эти обстоятельства подтолкнули меня к созданию собственного плеера.

Разработка первой версии

Первую версию плеера я разработал за три месяца. Дизайн и навигация были вдохновлены практиками популярных приложений. Иконки для приложения приобретены на стоковых ресурсах, а иконку самого приложения создал в онлайн-редакторе. В качестве основы для воспроизведения видео выбран встроенный в iOS AVPlayerViewController. Первые месяцы использования приложение показывало скромные результаты по загрузкам, но ситуация изменилась после упоминания в телеграм-канале азиатского блогера.

Неожиданный промоушн со стороны азиатского блогера
Неожиданный промоушн со стороны азиатского блогера

Доработка и новые функции

В дальнейшем было добавлено множество функций для работы с плейлистами, включая поиск, редактирование и загрузку по ссылке. Однако существенного роста загрузок это не принесло. Поэтому было решено усовершенствовать проигрыватель, устранив его недостатки, такие как сложности с кастомизацией и отслеживанием загрузки/буферизации видео.

На основе AVPlayer был создан улучшенный плеер с поддержкой полноэкранного режима, функцией Apple Play и режимом картинка в картинке. Новая версия увеличила стабильность приложения и решила проблемы с отслеживанием состояния загрузки видео и добавление нового функционала в плеер. Библиотека доступна по ссылке под лицензией MIT.

После миграции на самописную версию плеера показатель стабильности (crash-free) снизился до 95%. Анализ стектрейсов не давал ясности, и ошибки не воспроизводились на моих устройствах. Подозрения возникли вокруг использования KVO для отслеживания процесса загрузки. Проблему удалось решить путем введения дополнительной переменной, которая фиксировала наличие подписки KVO. Это позволило корректно управлять процессом отписки. Внедрение хотфикса позволило полностью избавиться от крешей.

Расширение поддержки форматов

AVPlayer поддерживает далеко не все форматы видео. Это приводило к тому, что некоторые каналы не воспроизводились, а у других отсутствовало видео, звук при этом сохранялся. В процессе поисков решения я наткнулся на VLC плеер с открытым исходным кодом, который распространяется под лицензией LGPLv2.1. Мне потребовалось время, чтобы разобраться с ограничениями, налагаемыми этой лицензией: она позволяет использовать библиотеку в коммерческом ПО, но требует открыть изменения в библиотеке, если таковые были, в отличие от GPLv2, которая обязует раскрыть весь код под той же лицензией.

Что касается интеграции VLCKit, он поддерживает установку через Cocoapods и Carthage, тогда как мой проект использует Swift Package Manager (SPM). На GitHub я нашёл репозиторий, который упаковал VLCKit в SPM, но там была не последняя версия библиотеки. Поэтому я создал форк и обновил VLCKit до последней версии.

Оставалось только интегрировать библиотеку в проект. Хотя у меня была идея разработать и продать отдельный улучшенный проигрыватель за подписку, но VLCKit не поддерживает функцию picture in picture, а работа с AirPlay оставляла желать лучшего, передавая только звук. В итоге я решил использовать свой пллеер на основе AVPlayer для открытия ссылок. Если воспроизведение заканчивается ошибкой или отсутствует видеопоток, то в дело вступает VLCKit. Если и VLCKit не справляется, пользователю выводится сообщение о недоступности канала. Библиотека с поддержкой VLC доступна здесь.

Немного цифр

Большинство пользователей приложения находятся в Китае и России, однако в последний месяц наблюдаю активный рост скачек в США. В закупку трафика не вкладывался. Особенно продуктивной оказалась стратегия локализации и внедрение новой функции, позволяющей пользователям оставлять отзывы. Хотя для сбора обратной связи использую встроенную систему голосования, большинство пользователей ограничиваются только выставлением оценок, редко прибегая к написанию текстовых отзывов. В будущем планирую разработать механизмы, стимулирующие пользователей к активному написанию рецензий, что поможет улучшить видимость приложения в AppStore.

Показы и загрузки за всю жизнь приложения
Показы и загрузки за всю жизнь приложения
Разбивка по странам и устройствам за всю жизнь приложения
Разбивка по странам и устройствам за всю жизнь приложения
Загрузки за последний месяц
Загрузки за последний месяц
Загрузки за последний месяц с разбивкой по странам и устройствам
Загрузки за последний месяц с разбивкой по странам и устройствам

Монетизация

Я экспериментировал с тремя видами рекламы на AdMob: нативной, которая интегрирована в ленту, межстраничной (Interstitial) и рекламой при открытии приложения (App Open). Изначально использовалась нативная реклама, но она приносила минимальный доход. Затем я перешел к рекламе App Open, что привело к небольшому улучшению показателей, но результаты все еще оставались хуже ожидаемых. Последним видом стала межстраничная реклама. Хотя она не идеально подходит для показа при старте приложения, так как для этого предназначена App Open, ее eCPM значительно выше. Сейчас реклама показывается раз в 3 часа при открытии приложения.

Статистика в AdMob
Статистика в AdMob

Какие планы по развитию проекта?

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

На этом все, благодарю за внимание!

PS: Ссылка на приложение.

Комментарии (0)