Реалізація запису аудіо в мобільному додатку
Диктофон, войс-повідомлення, запис інтерв'ю — кожна задача висуває свої вимоги до аудіо. Войс-повідомлення має бути маленьким (AAC, 32 кбіт/с), подкаст — без втрат (WAV або FLAC, 44100 Гц). Починаємо з аудіосесії: неправильна категорія — і звук іде не в той динамік, а інший додаток перехоплює запис. Ми вирішуємо ці проблеми на iOS та Android, використовуючи перевірені патерни. Досвід нашої команди — 10+ років у мобільній розробці, реалізовано 50+ проектів з аудіозаписом. Ми реалізували аудіозапис у додатках для журналістів, музикантів та месенджерів. Гарантуємо стабільну роботу навіть у фоні. Неправильна конфігурація призводить до спотворення звуку, обривів запису при згортанні та конфліктів з іншими аудіододатками. Ми навчилися уникати цих проблем і готові поділитися досвідом. У цій статті ви дізнаєтеся, як правильно налаштувати аудіосесію, обрати оптимальний формат, реалізувати візуалізацію та фоновий запис. На практиці зустрічаються проєкти, де аудіозапис реалізований з помилками — наприклад, неправильно обрано бітрейт (у 3 рази більший файл) або не налаштовано обробку переривань. Ми пропонуємо готове рішення, яке враховує всі нюанси. З нами ви отримаєте стабільний та продуктивний модуль запису, який легко інтегрується у ваш додаток.
Аудіосесія та категорії
iOS. AVAudioSession — центральний об'єкт керування. Детальніше про нього — у документації Apple. Для запису:
let session = AVAudioSession.sharedInstance() try session.setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker, .allowBluetooth]) try session.setActive(true) .playAndRecord дозволяє одночасно відтворювати та писати. .allowBluetooth включає запис з AirPods. Без .defaultToSpeaker — звук при відтворенні йде в ухо, не в динамік.
Проблема, яка зустрічається в продакшені: інший додаток (навігатор, музичний плеєр) перехоплює сесію. Підписуємося на AVAudioSession.interruptionNotification, при .began паузимо запис, при .ended з .shouldResume — відновлюємо.
Android. AudioRecord для прямого доступу до PCM-даних. MediaRecorder — простіше, але менше контролю над форматом. Для більшості завдань MediaRecorder достатній (див. документацію Android):
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC) mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4) mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC) mediaRecorder.setAudioSamplingRate(44100) mediaRecorder.setAudioEncodingBitRate(128000) VOICE_COMMUNICATION замість MIC включає ехоподавлення та шумоподавлення на рівні системи — корисно для войс-повідомлень.
| Параметр | iOS (AVAudioSession) | Android (MediaRecorder) |
|---|---|---|
| Категорія | .playAndRecord | AudioSource.MIC |
| Формат | M4A (AAC) | MPEG-4 (AAC) |
| Частота | 44100 Гц | 44100 Гц |
| Фоновий запис | UIBackgroundModes | ForegroundService |
Як обрати формат аудіозапису?
Вибір формату залежить від призначення. Для войс-повідомлень оптимальний AAC — він дає хорошу якість при низькому бітрейті, стискаючи в 2 рази краще за MP3. Для подкастів краще FLAC — стиснення без втрат при меншому розмірі, ніж WAV (на 60% менше). MP3 — універсальний вибір, але поступається AAC за розміром при тій же якості (файл на 40% більше). У таблиці нижче наведено характеристики популярних форматів.
| Формат | Розмір 1 хв | Сумісність | Застосування |
|---|---|---|---|
| AAC (M4A) | ~480 КБ | iOS, Android, Web | войс-повідомлення |
| MP3 | ~960 КБ | всюди | загальний випадок |
| WAV (PCM) | ~10 МБ | всюди | без втрат, диктофон |
| FLAC | ~3–5 МБ | Android native, iOS 11+ | без втрат, компактніше WAV |
| OGG/Opus | ~300 КБ | Android, Web | оптимальний для VoIP |
AAC перевершує MP3 за ефективністю стиснення: при однаковому бітрейті звучить краще, а розмір файлу менше на 50%. Для iOS-додатків використовуйте M4A-контейнер, для Android — MPEG-4.
Візуалізація рівня звуку
Амплітудний хвильовий індикатор — користувач бачить, що запис іде. На iOS: AVAudioRecorder.averagePower(forChannel: 0) повертає дБ (від -160 до 0). Нормалізуємо в 0..1:
let power = recorder.averagePower(forChannel: 0) let level = pow(10, power / 20) // dBFS → linear Опитуємо через Timer.scheduledTimer(withTimeInterval: 0.05) — 20 fps для плавної анімації. Це в 2 рази плавніше, ніж при 10 fps.
На Android: MediaRecorder.getMaxAmplitude() — максимальна амплітуда з останнього виклику (0–32767). Робимо Handler.postDelayed кожні 50 мс. Для точнішої візуалізації можна використовувати AudioRecord та аналізувати PCM-буфер у реальному часі, що дає 60 fps.
Для Flutter: record (pub.dev) надає onAmplitudeChanged stream, що спрощує інтеграцію.
Waveform при відтворенні — реалізація запису аудіо
Записаний файл аналізуємо офлайн: читаємо PCM-семпли, розбиваємо на чанки по N семплів, беремо RMS кожного чанка. Отримуємо масив float-значень — малюємо через Canvas або Path. На iOS потрібен AVAssetReader + AVAssetReaderTrackOutput з kAudioFormatLinearPCM.
Як забезпечити фоновий запис?
Якщо користувач згортає додаток — запис повинен тривати. iOS: UIBackgroundModes: audio в Info.plist, AVAudioSession залишається активною. Android: ForegroundService з типом microphone (android:foregroundServiceType="microphone" у маніфесті, обов'язково з Android 10). Сповіщення з кнопкою «Зупинити» — стандарт.
Без ForegroundService на Android 9+ система вб'є процес через кілька хвилин у фоні (зазвичай за 5 хвилин). На iOS без UIBackgroundModes запис зупиниться через 3 секунди після згортання. Налаштування фонового запису займає 1 годину при правильному підході.
Процес оцінки та роботи
- Аналіз вимог — визначаємо сценарії використання, цільові платформи, необхідні формати та функції (візуалізація, фоновий запис).
- Проектування архітектури — обираємо стек (Native або Flutter), проектуємо модуль запису з урахуванням аудіосесії та обробки переривань.
- Реалізація ядра — пишемо код для iOS (Swift) та Android (Kotlin), інтегруємо візуалізацію та збереження файлів.
- Тестування — перевіряємо на реальних пристроях, включаючи фоновий режим та переривання від інших додатків.
- Інтеграція та деплой — вбудовуємо модуль у проєкт, готуємо документацію, публікуємо в сторах.
Що входить у роботу
При замовленні реалізації аудіозапису ми надаємо:
- Готовий модуль запису з вибором формату та візуалізацією.
- Інтеграцію в існуючий проєкт (iOS, Android, Flutter).
- Документацію по API та налаштуванню.
- Тестування на реальних пристроях (включаючи фоновий режим).
- Підтримку при публікації в App Store та Google Play.
Типові помилки при реалізації запису
- Неправильна категорія аудіосесії на iOS (використовуйте .playAndRecord) - Відсутність ForegroundService на Android (запис уб'ють) - Вибір непідходящого формату (занадто великий файл)Орієнтири по термінах та вартості
Базовий запис з візуалізацією рівня та збереженням файлу — 1–2 дні, від 500$. Повноцінний диктофон з waveform, паузою, перейменуванням та фоновим записом — 3–4 дні, від 1200$. Вартість розраховується індивідуально під ваш проєкт. Оцінимо проект безкоштовно — пишіть!
Замовте реалізацію аудіозапису для вашого додатку вже сьогодні. Зв'яжіться з нами для консультації — ми допоможемо обрати оптимальне рішення та оцінити терміни. Реалізуємо під ключ за 3–5 днів залежно від складності.







