Разработка мобильного приложения для подкастов
Подкаст-приложение — это специфическая ниша внутри аудио-стриминга. Контент берётся из открытых RSS-фидов, воспроизводится долго (30–90 минут), требует variable speed playback, главы (chapters), transcript-синхронизации и надёжного offline-режима. Готовые SDK для подкастинга практически нет — всё собирается из компонентов.
RSS и парсинг фидов
Подкасты публикуются через RSS 2.0 с iTunes/Podcast namespace. Каждый эпизод — элемент <item> с <enclosure> (ссылка на MP3/AAC), <itunes:duration>, <itunes:image>, <itunes:episode>, <content:encoded> для show notes.
Парсинг на клиенте — XMLParser (iOS, SAX-based) или XmlPullParser (Android). Для регулярного обновления фидов фоновая задача предпочтительнее: BGAppRefreshTask (iOS) с интервалом не менее 15 минут, PeriodicWorkRequest в WorkManager (Android). Apple Podcast Index и Listen Notes — агрегаторы фидов с REST API, если нужна база тысяч подкастов без самостоятельного парсинга.
// iOS — загрузка и парсинг RSS фида
class PodcastFeedParser: NSObject, XMLParserDelegate {
private var currentElement = ""
private var currentEpisode: EpisodeBuilder?
func parser(_ parser: XMLParser, didStartElement elementName: String,
namespaceURI: String?, qualifiedName: String?,
attributes: [String: String] = [:]) {
currentElement = elementName
if elementName == "item" { currentEpisode = EpisodeBuilder() }
if elementName == "enclosure" {
currentEpisode?.audioURL = attributes["url"]
currentEpisode?.fileSize = Int(attributes["length"] ?? "0")
}
}
}
Воспроизведение с переменной скоростью
Speed playback (0.5x — 3.0x) без pitch shift — обязательная функция для подкастов. На iOS: AVPlayer.rate меняет скорость. AVAudioSession с AVAudioTimePitchAlgorithm.timeDomain на AVPlayerItem — убирает pitch shift при ускорении. Вариант .spectral — лучшее качество, но CPU затратнее.
На Android: ExoPlayer Media3 с PlaybackParameters(speed = 1.5f, pitch = 1.0f). Pitch = 1.0 означает фиксированный питч независимо от скорости.
Важно: при скорости > 2x у некоторых говорящих голос становится неразборчивым из-за алгоритма pitch correction. Это ограничение алгоритма, не бага реализации.
Главы (Podcast Chapters)
Главы — навигация внутри длинного эпизода. Два формата: MP3 ID3 chapter frames (CHAP тег) и Podlove Simple Chapters (в RSS XML). Apple Podcasts поддерживает оба.
Для чтения ID3 chapters на iOS: AVMetadataItem через AVAsset.loadMetadata(for: .id3Metadata), ищем AVMetadataID3MetadataKeyChapterTOC и AVMetadataID3MetadataKeyChapter. На Android — ID3 parsing через ExoPlayer Metadata output или сторонние библиотеки (jaudiotagger).
UI для глав: timeline с маркерами, список глав с возможностью перехода по тапу на AVPlayer.seek(to: CMTime) / player.seekTo(positionMs).
Транскрипт и синхронизация текста
Podcast Namespace <podcast:transcript> — тип application/srt или application/json (WebVTT-подобный формат). При воспроизведении — подсвечивать текущую строку транскрипта по AVPlayer.currentTime.
Если транскрипта нет — генерация через Whisper (OpenAI API или локальный inference через whisper.cpp). На iPhone с Neural Engine — whisper.cpp с CoreML-моделью small работает в 2–3x realtime. Для серверной генерации по требованию — экономически целесообразнее облачный API.
Offline и управление загрузками
Загрузка эпизода: URLSessionDownloadTask с URLSessionConfiguration.background. Прогресс через URLSessionDownloadDelegate.urlSession(_:downloadTask:didWriteData:). Файл сохраняется в documentDirectory с именем на основе episode ID.
Управление хранилищем — важная часть UX: показывать размер загруженных эпизодов, предлагать удалить прослушанные, настраивать авто-загрузку новых эпизодов.
Lock Screen и CarPlay
Lock Screen: MPNowPlayingInfoCenter с MPNowPlayingInfoPropertyPlaybackRate, MPNowPlayingInfoPropertyDefaultPlaybackRate, MPNowPlayingInfoPropertyChapterCount, MPNowPlayingInfoPropertyCurrentChapterIndex. Главы отображаются в iOS Control Center.
CarPlay: CPTemplateApplicationScene + CPListTemplate для каталога подкастов. CPNowPlayingTemplate — экран воспроизведения. Требует отдельного entitlement (com.apple.developer.carplay-audio).
Рекомендации и открытие подкастов
Podchaser API, Podcast Index API — агрегаторы с метаданными и рейтингами. Для рекомендаций по истории прослушивания — topic modeling через LDA или sentence embeddings (описания подкастов → косинусное сходство). На старте достаточно простой логики: «слушал X → другие, кто слушал X, слушали Y».
1 неделя — 3 месяца в зависимости от объёма: от простого агрегатора с плеером до полнофункциональной платформы с собственным хостингом и аналитикой. Стоимость рассчитывается индивидуально.







