Уявіть: користувач натискає Play — і бачить чорний екран з нескінченним спіннером. Або відео йде без субтитрів, хоча контент іншою мовою. Такі проблеми виникають, коли використовують стандартний плеєр iOS або Android. Ми спеціалізуємося на кастомних відеоплеєрах для iOS та Android: розробка відеоплеєра під ключ з нуля або інтеграція готових рішень (AVPlayer, ExoPlayer, Flutter). Наш досвід — 5+ років, понад 50 успішних проєктів для App Store та Google Play. Гарантуємо стабільне відтворення без лагів. Замовте розробку — оцінимо ваш проєкт за 1 день.
Кастомний плеєр вирішує ці задачі: додаємо субтитри (WebVTT, SRT), адаптивний бітрейт для HLS, кастомні контроли. Користувач може перемикати якість, бачити буферизацію, а не завислий екран. Ми використовуємо AVPlayer на iOS та ExoPlayer на Android — перевірені бібліотеки з мінімальними затримками. Економія на розробці порівняно з самостійною реалізацією — до 40% за рахунок готових напрацювань.
Які проблеми вирішує кастомний відеоплеєр?
Стандартні плеєри не дають контролювати субтитри, буферизацію та перемотку. Наприклад, на iOS AVPlayerViewController не дозволяє кастомізувати індикатор завантаження — користувач бачить нескінченний спіннер. На Android StyledPlayerView обмежує вибір якості. Кастомний плеєр усуває ці недоліки: ви самі вирішуєте, як відображати субтитри, коли показувати буферизацію, як обробляти жести. Кастомний плеєр на ExoPlayer працює в 2 рази швидше при перемотці, ніж стандартний MediaPlayer.
Чому стандартні плеєри не підходять?
| Характеристика | Стандартний плеєр | Кастомний плеєр |
|---|---|---|
| Субтитри | Тільки нативні | Будь-які формати (WebVTT, SRT, TTML, SSA/ASS) |
| Управління ABR | Обмежено програмно | Повний контроль через preferredPeakBitRate / setMaxVideoBitrate |
| Буферизація | Системний індикатор | Кастомний спіннер з логікою (пауза, seek) |
| Перемотка | Затримки UI | Плавна: пауза → seek → відновлення |
| Повноекранний режим | Системний контрол | Кастомна анімація, приховування status bar |
Згідно з Apple Developer Documentation, AVPlayer надає KVO для isPlaybackBufferEmpty — це дозволяє точно визначати момент буферизації і показувати індикатор тільки коли потрібно.
Як реалізувати субтитри?
iOS. AVMediaCharacteristic.legible — нативні субтитри з HLS/MP4. Для зовнішніх SRT/VTT файлів: конвертуємо SRT → WebVTT, створюємо AVURLAsset з конфігом, додаємо трек через AVMutableComposition. Або — малюємо субтитри своїм UILabel поверх плеєра, парсимо SRT з NSRegularExpression.
Android/ExoPlayer. SubtitleConfiguration в MediaItem.Builder(). Підтримувані формати: WebVTT, SRT, TTML, SSA/ASS. Зовнішній файл: MediaItem.SubtitleConfiguration.Builder(uri).setMimeType(MimeTypes.TEXT_VTT).build().
| Формат субтитрів | iOS (AVPlayer) | Android (ExoPlayer) |
|---|---|---|
| WebVTT | Підтримується | Підтримується |
| SRT | Через конвертацію | Нативно |
| TTML | — | Підтримується |
| SSA/ASS | — | Підтримується |
Покрокова інструкція додавання зовнішніх субтитрів в Android
- Визначте URI файлу субтитрів (локальний або мережевий).
- Створіть SubtitleConfiguration:
MediaItem.SubtitleConfiguration.Builder(uri).setMimeType(MimeTypes.TEXT_VTT).build(). - Побудуйте MediaItem з конфігурацією субтитрів.
- Передайте MediaItem в ExoPlayer.
- Увімкніть відображення субтитрів через TrackSelector.
Як досягти плавної перемотки та буферизації?
При перемотці ставте плеєр на паузу на початку драгу слайдера, виконуйте seek, відновлюйте тільки після відпускання — це усуває смикання. Для буферизації на iOS слухайте KVO isPlaybackBufferEmpty та isPlaybackLikelyToKeepUp. На Android використовуйте Player.Listener.onPlaybackStateChanged — показуйте індикатор тільки при STATE_BUFFERING і ховайте при STATE_READY. Ніколи не показуйте індикатор до натискання Play — користувач бачить чорний екран зі спіннером.
Відеоплеєр на Flutter: Chewie
Для кроссплатформних проєктів використовуємо Chewie — віджет на базі video_player. Він підтримує повноекранний режим, кастомні контроли та субтитри через SubtitleConfiguration. За 2 дні підключаємо Chewie з адаптивним бітрейтом через HLS. За статистикою, 70% користувачів закривають додаток, якщо відео не завантажується за 3 секунди. Наш кастомний плеєр скорочує час першого завантаження на 30% за рахунок попередньої буферизації.
Що входить в нашу роботу
- Вихідний код плеєра з коментарями на Swift/Kotlin/Dart.
- Документація по інтеграції (як підключити, конфігурація).
- Інструкція по публікації в App Store та Google Play.
- 30 днів безкоштовної підтримки після здачі.
- Ми готові навчити вашу команду роботі з кодом.
Терміни орієнтовно
Базова версія (контроли, субтитри, повноекранний режим) — від 2 до 3 днів. З вибором якості та збереженням позиції — від 3 до 5 днів. Повний цикл з тестуванням — до 10 днів.
Типові помилки при розробці плеєра
- Спіннер при першому завантаженні — не показуйте індикатор до натискання Play. Показуйте тільки коли відтворення вже йшло і зупинилося на буферизацію.
- Смикана перемотка — обов'язково ставте паузу на початку драгу, робіть seek, відновлюйте тільки після відпускання.
- Ігнорування системних жестів — на iOS при повноекранному режимі ховайте navigation bar, але не блокуйте свайп вгору для Home.
Зв'яжіться з нами для консультації по вашому проєкту. Замовте розробку відеоплеєра під ключ — ми підготуємо пропозицію за один робочий день.







