- 10 best audio recording apps for Android
- BandLab
- Dolby On
- Easy Voice Recorder
- FL Studio Mobile
- Hi-Q MP3 Voice Recorder
- Создание собственного Android-диктофона с помощью Kotlin
- Создание пользовательского интерфейса
- Запрос требуемых разрешений
- Запись и сохранение аудио
- Добавление OnClickListeners
- Настройка MediaRecorder
- Запись и сохранение аудио
- Исходный код
- Заключение
- Создание собственного Android-диктофона с помощью Kotlin
- Создание пользовательского интерфейса
- Запрос требуемых разрешений
- Запись и сохранение аудио
- Добавление OnClickListeners
- Настройка MediaRecorder
- Запись и сохранение аудио
- Исходный код
- Заключение
- Работа с потоковым аудио
- Введение
10 best audio recording apps for Android
Read more:
BandLab
Price: Free
BandLab is an above average audio recorder. It’s mostly for whole band or musician setups. It features a 12-track mixer, a bunch of audio samples, a looper, a guitar tuner, and, of course, the ability to record audio. It may be a little much for a single artist or simple voice recordings. However, those who want to give audio recording a real try and need multiple tracks have a decent option with this one. There is also a social media element that people seem to enjoy.
Dolby On
Price: Free
Dolby On is a shockingly good audio recording app. It’s useful for both voice and instruments. It not only does the basics like recording audio, but you can fiddle with it in a number of ways. The features include an EQ, spatial audio, noise reduction, de-essing, and even fade in and out effects. The thing is, it doesn’t take a lot of words to describe this app but it does a bunch of stuff. This was one of our picks for the best of 2020 despite being just an audio recorder. It’s that good. The app is also free as of the time of this writing.
Easy Voice Recorder
Price: Free / $3.99
Easy Voice Recorder is what the name says. This is mostly for simple voice recordings. You hit the button, it records some audio, and that’s it, basically. It works great for recording lectures, interviews, and other practical uses. It also exports to MP3 so it’s also decent for the occasional acoustic guitar recording or something similar. The app also supports Wear OS and includes a dark theme. The free version contains ads and the premium version does not. This is a good, simple audio recorder.
FL Studio Mobile
Price: $15.99 with in-app purchases
FL Studio Mobile is a lot like Caustic 3. It has a bunch of tools for electronic style music like electronica, techno, hip-hop, and similar music styles. That includes a bunch of effects, synths, and the ability to record live audio if needed. You can create, mix, master, etc. There are tools for all of that stuff. It also includes plugin support. The app started a little bit clunky, but has improved over time. The price tag is also a little bit steep. We definitely don’t recommend this one for simple recording tasks. The app goes for $15.99. The in-app purchases are for additional plugins and add-ons.
Hi-Q MP3 Voice Recorder
Price: Free / $3.49
Hi-Q is an above average voice recorder. It’s mostly for business and academic use such as meetings, interviews, notes, lectures, and things like that. It supports MP3 and that makes it decent for the occasional guitar song or musical idea as well. The app also features Dropbox support, widgets, and a WiFi transfer function. The quality is also pretty decent, although a lot of that depends on your device’s microphone as well. There is a free and premium version. The premium version has all of the extra features.
Источник
Создание собственного Android-диктофона с помощью Kotlin
Мультимедийный фреймворк Android поддерживает запись и воспроизведение аудио. В этой статье я покажу, как разработать простое приложение для звукозаписи, которое будет записывать аудио и сохранять его в локальном хранилище Android-устройства с помощью MediaRecorder из Android SDK.
Вы также узнаете, как запросить разрешения у пользователя в режиме реального времени и как работать с локальным хранилищем Android-устройства.
Создание пользовательского интерфейса
Сперва нам нужно создать интерфейс для звукозаписи. Это простой layout с тремя кнопками, которые будут использоваться для запуска, приостановки/возобновления и остановки записи.
Запрос требуемых разрешений
После создания пользовательского интерфейса мы можем начать использовать MediaRecorder для реализации основной функциональности нашего приложения. Но сначала нам нужно запросить необходимые разрешения для записи аудио и доступа к локальному хранилищу. Cделаем мы это это с помощью нескольких простых строк кода в нашем файле AndroidManifest.xml :
Также нужно проверить, одобрил ли пользователь разрешения, прежде чем мы сможем использовать наш MediaRecorder . Сделаем это в Activity MainActivity.kt :
Примечание: позже эти строки кода будут перемещены в OnClickListener кнопки начала записи аудио, чтобы мы могли убедиться, что MediaRecorder не будет запущен без необходимых разрешений.
Запись и сохранение аудио
Добавление OnClickListeners
Добавим слушатели к кнопкам, чтобы они реагировали на пользовательские события. Как я упоминал ранее, проверка на наличие необходимых разрешений будет добавлена в OnClickListener кнопки начала записи аудио:
Настройка MediaRecorder
Далее нам нужно указать путь для сохранения аудио и настроить MediaRecorder.
Мы берём путь к корню нашего внешнего хранилища и добавляем в него имя нашей записи и тип файла. После этого мы создаём объект MediaRecorder и определяем источник звука, аудиокодер, формат и файл для записи.
Запись и сохранение аудио
Код, используемый для запуска MediaRecorder , определяется в OnClickListener кнопки начала записи аудио:
Как видите, нужно вызвать функцию prepare , прежде чем мы сможем начать запись. Мы также встраиваем вызов в блок try-catch, чтобы приложение не сломалось при сбое функции prepare .
OnClickListeners кнопки остановки записи очень похож на код выше.
Здесь мы проверяем, работает ли в данный момент MediaRecorder , прежде чем мы остановим запись, потому что наше приложение сломается, если метод stop будет вызван, в то время как MediaRecorder не будет запущен. После этого мы меняем переменную состояния на false , чтобы пользователь не мог снова нажать кнопку остановки.
Нам осталось определить OnClickListener для кнопки приостановки/возобновления.
В этих двух методах мы проверяем, работает ли MediaRecorder . Если работает, мы приостановим запись и изменим текст кнопки для возобновления. При повторном нажатии запись возобновится.
Наконец, мы можем записать аудио и прослушать его, открыв файл recording.mp3 , который будет сохранён в нашем локальном хранилище. Просто откройте проводник файлов и сделайте поиск по имени файла recording.mp3 .
Исходный код
Вот полный исходный код нашего приложения:
Заключение
Теперь вы знаете, как работает MediaRecorder , как запрашивать разрешения в режиме реального времени и почему это важно делать. Вы также узнали о локальном хранилище вашего устройства Android и о том, как хранить в нём данные.
Более сложная версия этого приложения, в которой есть некоторые дополнительные функции, такие как воспроизведение ваших записей с помощью MediaPlayer , доступна на Github.
Источник
Создание собственного Android-диктофона с помощью Kotlin
Мультимедийный фреймворк Android поддерживает запись и воспроизведение аудио. В этой статье я покажу, как разработать простое приложение для звукозаписи, которое будет записывать аудио и сохранять его в локальном хранилище Android-устройства с помощью MediaRecorder из Android SDK.
Вы также узнаете, как запросить разрешения у пользователя в режиме реального времени и как работать с локальным хранилищем Android-устройства.
Создание пользовательского интерфейса
Сперва нам нужно создать интерфейс для звукозаписи. Это простой layout с тремя кнопками, которые будут использоваться для запуска, приостановки/возобновления и остановки записи.
Запрос требуемых разрешений
После создания пользовательского интерфейса мы можем начать использовать MediaRecorder для реализации основной функциональности нашего приложения. Но сначала нам нужно запросить необходимые разрешения для записи аудио и доступа к локальному хранилищу. Cделаем мы это это с помощью нескольких простых строк кода в нашем файле AndroidManifest.xml :
Также нужно проверить, одобрил ли пользователь разрешения, прежде чем мы сможем использовать наш MediaRecorder . Сделаем это в Activity MainActivity.kt :
Примечание: позже эти строки кода будут перемещены в OnClickListener кнопки начала записи аудио, чтобы мы могли убедиться, что MediaRecorder не будет запущен без необходимых разрешений.
Запись и сохранение аудио
Добавление OnClickListeners
Добавим слушатели к кнопкам, чтобы они реагировали на пользовательские события. Как я упоминал ранее, проверка на наличие необходимых разрешений будет добавлена в OnClickListener кнопки начала записи аудио:
Настройка MediaRecorder
Далее нам нужно указать путь для сохранения аудио и настроить MediaRecorder.
Мы берём путь к корню нашего внешнего хранилища и добавляем в него имя нашей записи и тип файла. После этого мы создаём объект MediaRecorder и определяем источник звука, аудиокодер, формат и файл для записи.
Запись и сохранение аудио
Код, используемый для запуска MediaRecorder , определяется в OnClickListener кнопки начала записи аудио:
Как видите, нужно вызвать функцию prepare , прежде чем мы сможем начать запись. Мы также встраиваем вызов в блок try-catch, чтобы приложение не сломалось при сбое функции prepare .
OnClickListeners кнопки остановки записи очень похож на код выше.
Здесь мы проверяем, работает ли в данный момент MediaRecorder , прежде чем мы остановим запись, потому что наше приложение сломается, если метод stop будет вызван, в то время как MediaRecorder не будет запущен. После этого мы меняем переменную состояния на false , чтобы пользователь не мог снова нажать кнопку остановки.
Нам осталось определить OnClickListener для кнопки приостановки/возобновления.
В этих двух методах мы проверяем, работает ли MediaRecorder . Если работает, мы приостановим запись и изменим текст кнопки для возобновления. При повторном нажатии запись возобновится.
Наконец, мы можем записать аудио и прослушать его, открыв файл recording.mp3 , который будет сохранён в нашем локальном хранилище. Просто откройте проводник файлов и сделайте поиск по имени файла recording.mp3 .
Исходный код
Вот полный исходный код нашего приложения:
Заключение
Теперь вы знаете, как работает MediaRecorder , как запрашивать разрешения в режиме реального времени и почему это важно делать. Вы также узнали о локальном хранилище вашего устройства Android и о том, как хранить в нём данные.
Более сложная версия этого приложения, в которой есть некоторые дополнительные функции, такие как воспроизведение ваших записей с помощью MediaPlayer , доступна на Github.
Источник
Работа с потоковым аудио
Введение
Конструктор
Для создания объекта нужно указать:
audioSource | Откуда ведётся запись. В нашем случае это MediaRecorder.AudioSource.MIC |
---|---|
sampleRateInHz | Частота дискретизации в герцах. Документация утверждает, что 44100Гц поддерживается всеми устройствами |
channelConfig | Конфигурация каналов. Может быть CHANNEL_IN_MONO или CHANNEL_IN_STEREO . Моно работает везде. Важно: эти константы не совпадают с количеством каналов, которое они обозначают. В этот параметр нельзя передавать 1 или 2. |
audioFormat | Формат входных данных, более известный как кодек. Может быть ENCODING_PCM_16BIT или ENCODING_PCM_8BIT |
bufferSizeInBytes | Размер того самого внутреннего буфера. Из него можно считывать аудиопоток. Размер порции считывания не должен превышать эту величину. У этого параметра есть минимально допустимое значение, которое можно получить через getMinBufferSize() . |
При своём создании объект пытается получить нужные ему ресурсы системы. Насколько удачно у него это получилось, можно узнать, вызвав функцию getState() . Если она вернёт STATE_INITIALIZED , то всё нормально, если STATE_UNINITIALIZED — значит, произошла ошибка.
Причин ошибки может быть две: слишком маленький буфер и недопустимый формат. Первого нужно избегать вызовом getMinBufferSize() . Второго, на самом деле, им же.
getMinBufferSize()
Этот статический метод выдаёт минимальный размер внутреннего буфера, при котором объект AudioRecord сможет работать. Параметры имеют тот же смысл, что и для конструктора. Следует заметить, что использование именно этой величины для записи — не лучшая идея. Если система будет ещё чем-то занята, то программа всё равно может не успевать считывать все данные подряд, и в записи будут дырки. Мне встречался совет брать размер в десять раз больше.
Получение списка форматов
Метод getMinBufferSize() имеет приятную особенность — ругаться на недопустимые для данного устройства параметры, возвращая ERROR_BAD_VALUE или ERROR . Это означает, что перебирая все возможные сочетания, можно узнать, какие форматы поддерживает устройство.
Считывание данных
Для получения данных из внутреннего буфера служит метод read() . Он существует в трёх вариантах:
- read(byte[] audioData, int offsetInBytes, int sizeInBytes)
- read(short[] audioData, int offsetInShorts, int sizeInShorts)
- read(ByteBuffer audioBuffer, int sizeInBytes)
Их параметры:
audioData | массив, в который будут записаны данные |
---|---|
audioBuffer | буфер, в который будут записаны данные |
offsetInBytes / offsetInShorts | индекс, с которого начнётся запись |
sizeInShorts | размер запрашиваемого блока данных. В байтах для ByteBuffer и byte[] , в коротких целых для short[] |
Если всё нормально, то метод вернёт количество прочитанных байт, если это вариант с ByteBuffer или byte[] , или прочитанных коротких целых для short[] . Если на момент вызова объект не был правильно инициализирован, то выдаст ERROR_INVALID_OPERATION, а если что-то не так с параметрами — ERROR_BAD_VALUE
Важно: метод блокирует вызывающий поток до тех пор, пока не считает запрошенное количество данных. Если во внутреннем буфере их недостаточно, то read() будет ожидать, пока они придут от микрофона. Поэтому метод следует вызывать из отдельного потока, иначе приложение будет висеть.
Подход, отход, фиксация
Чтобы программа могла получать данные от микрофона, нужно указать в файле AndroidManifest,xml соответствующее разрешение:
Чтобы начать запись, нужно вызвать метод startRecording() , а чтобы закончить — stop() . Запускать и останавливать запись можно сколько угодно раз.
После того, как работа с объектом закончена, следует вызвать метод release() . Он освободит все системные ресурсы, захваченные объектом. После этого объект нельзя использовать, а ссылающуюся на него переменную следует установить в null .
Важно: эти три метода, в отличие от упоминавшихся ранее, выбросят IllegalStateException , если их вызвать для неинициализированного (ну и слово. ) объекта или не в том порядке. Поэтому обращаться с ними нужно «аккуратно», т.е. через блок try .
Пример использования
Приведённый ниже класс делает всё то, о чём сказано выше. Кроме того, он посылает зарегистрированным у него Handler -ам сообщения о принятых данных. Эти данные будут обрабатываться в другом потоке, поэтому, чтобы не затереть ещё не обработанные данные новыми, использован циклический буфер.
В коде использован класс AudioFormatInfo . Он представляет собой POJO с тремя полями, описывающими формат записи: sampleRateInHz , channelConfig и audioFormat .
Источник