Розробка мобільного додатку для аудіокниг
Audiobooks-плеєр — одне з технічно щільних медіа-додатків на мобільному. Тут сходяться: точне управління відтворенням, агресивне кеширування великих файлів, DRM для захисту контенту, навігація по главах, таймер сну та синхронізація позиції між пристроями. Кожен пункт — це конкретна реалізація, а не просто «медіаплеєр».
Формат файлів та потокове відтворення
Аудіокниги найчастіше у форматах: MP3 (найширший), M4B (AAC в контейнері MP4 з chapter markers, стандарт Apple), M4A, OGG/Opus. M4B переважніший для нових каталогів — він нативно містить главы, обложку та метадані без sidecar.
Потокове відтворення (не скачувати повністю перед відтворенням): AVPlayer на iOS відкриває HTTP URL і починає грати без повної загрузки. ExoPlayer (Media3) на Android — аналогічно через DefaultDataSource.Factory. Для довгих файлів (15 годин = ~800 МБ) критично.
Главы з M4B: AVAsset.loadChapterMetadataGroups(bestMatchingPreferredLanguages:) повертає AVTimedMetadataGroup[] з часовими метками та назвами. На Android — MediaMetadataRetriever.extractMetadata + парсинг MP4 box structure для chapter atoms, або використовуємо ExoPlayer з кастомним MetadataRetriever.
Точне зберігання позиції
Користувач слухав книгу в машині, закрив додаток — при наступному відкритті повинен попасти ровно на те місце. З точністю до секунди.
Зберігаємо currentTime (Double, секунди) + bookId + timestamp збереження в UserDefaults/SharedPreferences при кожному фоновому переході, уході в background (applicationDidEnterBackground) та через Timer кожні 5 секунд під час відтворення. Timer кожні 5 секунд — не кожну секунду, це надлишково.
При відновленні: player.seek(to: CMTime(seconds: savedPosition, preferredTimescale: 1000)) з .seconds точністю. Не MSEC — для аудіо достатньо.
Синхронізація між пристроями: CloudKit CKRecord (iOS) або Firebase Firestore з userId/bookId ключем. При відкритті книги на новому пристрої пропонуємо «Продовжити з 1:23:45» — користувач вирішує.
Таймер сну
Популярна функція: відтворення зупиняється через N хвилин. Тривіально — DispatchQueue.main.asyncAfter (iOS) або Handler.postDelayed (Android). Нетривіальний варіант: «зупинити в кінці поточної главы» — отримуємо endTime поточної главы з метаданих та планюємо зупинку на це время.
Плавне затухання перед зупинкою: за 30 секунд до кінця зменшуємо player.volume лінійно до 0 через CADisplayLink / ValueAnimator. Не різка зупинка — це подразнює.
Швидкість відтворення та pitch correction
player.rate = 1.5 (AVPlayer) пришвидшує відтворення, але піднімає pitch — голос стає писклявим. iOS автоматично застосовує pitch correction для AVPlayer при rate ≠ 1.0 з iOS 16. На більш старих — AVAudioUnitTimePitch в AVAudioEngine pipeline.
Android ExoPlayer: playbackParameters = PlaybackParameters(speed = 1.5f) — pitch correction вбудований. Flutter just_audio: player.setSpeed(1.5) з pitchCorrectionMethod за замовчуванням.
Діапазон корисних швидкостей: 0.75x (для складного технічного контенту), 1.0x, 1.25x, 1.5x, 2.0x. Більше 2x — розбірливість падає критично.
Офлайн-скачування та DRM
Скачування для офлайну — URLSessionDownloadTask + URLSessionConfiguration.background (iOS): працює навіть коли додаток не запущений, прогрес зберігається при крашах. Android: WorkManager + DownloadManager або OkHttp з кастомним прогресом.
Для платного контенту потрібен DRM. FairPlay Streaming (iOS) — інтегрується з AVContentKeySession. Widevine L3 (Android) — ExoPlayer з DefaultDrmSessionManager. Ключ шифрування запитується у лицензійного сервера при кожному відтворенні. Без DRM користувач копіює файл з /Library/Application Support та слухає без підписки.
Альтернатива без full DRM: AES-256 шифрування файлу на диску з ключем, привязаним до аккаунту та DeviceID. Дешевше в реалізації, але менше захисту.
Каталог та пошук
Бібліотека користувача: куплені та скачані книги. Каталог магазину: пошук, жанри, новинки, рекомендації. Пагінація через cursor (Alchemy-style next token або offset/limit). Обложки — через SDWebImage/Coil/cached_network_image з агресивним disk cache (обложки змінюються рідко).
| Функція | MVP | Повна версія |
|---|---|---|
| Відтворення MP3/M4B | так | так |
| Главы та навігація | ні | так |
| Офлайн-скачування | ні | так |
| Синхронізація позиції | ні | так |
| DRM | ні | так |
| Таймер сну | так | так |
Строки: MVP-плеєр з каталогом та базовим відтворенням — 3-4 тижні. Повний продукт з DRM, офлайном, синхронізацією та підпискою — 8-12 тижнів.







