Работа с потоковым аудио
Введение
Конструктор
Для создания объекта нужно указать:
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 .
Источник
Supported Audio Formats
Android supports a variety of audio file formats and codecs for playback (it supports fewer for recording, which we’ll discuss when we go over recording).
■ AAC: Advanced Audio Coding codec (as well as both profiles of HE-AAC, High Efficiency AAC), .m4a (audio/m4a) or.3gp (audio/3gpp) files. AAC is a popular standard that is used by the iPod and other portable media players. Android supports this audio format inside of MPEG-4 audio files and inside of 3GP files (which are based on the MPEG-4 format). Recent additions to the AAC specification, High Efficiency AAC are also supported.
■ MP3: MPEG-1 Audio Layer 3, .mp3 (audio/mp3) files. MP3, probably the most widely used audio codec, is supported. This allows Android to utilize the vast majority of audio available online through various web sites and music stores.
■ AMR: Adaptive Multi-Rate codec (both AMR Narrowband, AMR-NB, and AMR Wideband, AMR-WB), .3gp (audio/3gpp) or .amr (audio/amr) files. AMR is the audio codec that has been standardized as the primary voice audio codec in use by the 3GPP (3rd Generation Partnership Project). The 3GPP is a telecommunications industry organization that creates specifications for the partner companies to use. In other words, the AMR codec is what is primarily used for voice calling applications on modern mobile phones and generally supported across mobile handset manufacturers and carriers. As such, this codec is generally useful for voice encoding but doesn’t perform well for more complex types of audio such as music.
■ Ogg: Ogg Vorbis, .ogg (application/ogg) files. Ogg Vorbis is an open source, patent-free audio codec with quality that is comparable to commercial and patent-encumbered codecs such as MP3 and AAC. It was developed by volunteers and is currently maintained by the Xiph.Org foundation.
■ PCM: Pulse Code Modulation commonly used in WAVE or WAV files (Waveform Audio Format), .wav (audio/x-wav) files. PCM is the technique used for storing audio on computers and other digital audio devices. It is generally an uncompressed audio file with data that represents the amplitude of a piece of audio over time. The «sample rate» is how often an amplitude reading is stored. The «bit-depth» is how many bits are used to represent an individual sample. A piece of audio data with a sample rate of 16kHz and a bit-depth of 32 bits means that it will contain 32 bits of data representing the amplitude of the audio and it will have 16,000 of these per second. The higher the sample rate and the higher the bit-depth, the more accurate the digitization of the audio is. Sample rate and bit-depth also determine how large the audio file will be when its length is taken into account. Android supports PCM audio data within WAV files. WAV is a longstanding standard audio format on PCs.
Источник
Audio format in android
Модификация и улучшение качества звука андройд | Modification and improvement of sound quality android
Данная тема создана с целью улучшения и повышения звуковых характеристик андройд устройств,
где все подробно описано начиная от простых действий в build.prop,
заканчивая внедрением сторонних аудио библиотек в свой смартфон.
Тему буду обновлять по ходу времени
Для всех действий понадобится наличе root прав
Список samplingRates 8000,16000,32000,44100,48000,88200,96000,176400,192000,384000,768000
Список format по возрастанию в качестве
AUDIO_FORMAT_PCM_16_BIT
AUDIO_FORMAT_PCM_24_BIT_PACKED (в основном используется для a2dp профиля)
AUDIO_FORMAT_PCM_8_24_BIT
AUDIO_FORMAT_PCM_32_BIT
Флаг fast
Он же вывод звука с низкой задержкой до 40 мс
16 bit и 48Khz максимкльно и все что ниже. Нельзя выводить hires
Разгрузка offload
Список форматов:
AUDIO_OUTPUT_FLAG_DIRECT (прямой выход)
AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD (сжатие аудио на выходе)
AUDIO_OUTPUT_FLAG_NON_BLOCKING (аудио выход не блокируется)
используется для вывода на bluetooth или устройства где это необходимо гарнитуру, современные устройства компрессиуют сигнал до mp3 под кодек SBC,если наушники (устройство) не поддерживают кодек ldac, aptx и hwa
если есть возможность выводить через hires кодек, то вывод идет через 24_BIT_PACKED, упрощенный формат 24bit
Прямой вывод звука, игнорирование всех эффектов системы и пост обработок, то есть вывод HIRES
Список форматов:
AUDIO_OUTPUT_FLAG_DIRECT (прямой выход)
AUDIO_OUTPUT_FLAG_DIRECT_PCM (прямой выход в PCM контейнере)
В чем разница незнаю, можете использовать 1 один из них
Флаги выхода аудио
AUDIO_OUTPUT_FLAG_PRIMARY (первичный аудио выход, используется по стандарту в большинстве устройств)
AUDIO_OUTPUT_FLAG_DEEP_BUFFER (Глубокий буффер)
Список форматов компрессии аудио от самого высокого до низкого качества (это не весь список, но самые нормальные) (не все будут поддерживаться)
AUDIO_FORMAT_FLAC
AUDIO_FORMAT_ALAC
AUDIO_FORMAT_APE
AUDIO_FORMAT_VORBIS
AUDIO_FORMAT_WMA
AUDIO_FORMAT_WMA_PRO
AUDIO_FORMAT_MP3 (по умолчанию)
bundle <
path /system/lib64/soundfx/libbundlewrapper.so
>
>
effects <
bassboost <
library bundle
uuid 8631f300-72e2-11df-b57e-0002a5d5c51b
>
>
Разложить все файлы по папкам из архива, и дать разрешения
Правка разрешений файлов
/bin/alsa_amixer 0755
/bin/alsa_aplay 0755
/bin/alsa_ctl 0755
/lib/libasound.so 0644
/usr/share/alsa //всем папкам 0755, всем файлам в папке alsa 0644
Драйвер для 32/64 битных процессоров: alsa_32bit.zip ( 405.16 КБ )
(ограничение андройд от 4 до 6 выше работать не будет)
Дополнение положить в /system/lib/hw с правами 0644 (может как положительно так и негативно сказаться на звуке): alsa.default.so.zip ( 12.96 КБ )
Готовый скрипт для запуска alsa: alsa.sh.zip ( 272 байт )
# Нестандартные
Имеет качествнный алгоритм обработки аудио
Ставить с заменой, если в /system/lib/libasound.so имеется данная библиотека, если ее нет бесполезно (возможно появистя эффект, но не уверен) В /system/bin не должно быть бинарников от alsa, иначе с замной библиотеки пропадет звук, сделайте копию оригинала для безопасности 🙂
Библиотека asound от Samsung GS8+: alsa_asound_sgs8+.zip ( 262.15 КБ )
Библиотеки брал от 6 андройд, но должны работать и на версиях ниже, так как они универсальные
ВАЖНО сделайте бекап системного раздела не гарантирую 100% работу библиотек (телефон может зависнуть на вечной анимации) , можете перебирать по одной и наблюдать как ведет себя смартфон
Установка: перенести все библиотеки с заменой в /system/lib и дать права 0644
Можно упростить процесс правки прав
su #получаем root
mount -o rw,remount /system #перевод системного раздела в запись
chmod 0644 /system/lib/*.so #смена прав
Список библиотек:
/libaudioflinger.so
/libaudioresampler.so
/libaudiospdif.so
/libaudioutils.so
/libeffects.so
/libinput.so
/libinputflinger.so
/libsonic.so
/libsonivox.so
/libsoundtrigger.so
/libspeexresampler.so
/libwebrtc_audio_coding.so
/libwebrtc_audio_preprocessing.so
В целом повышает общий уровень громкости, четкость, басс.audio_engine.zip ( 1.24 МБ )
Рекомендации:
1. Используйте только от флагманов звуковые библиотеки. Так как только на данных устройствах,
производители делают максимальный акцент на составляющие устройства. Так же папка soundfx
2. Многие попросту удаляют папку soundfx с устройства и прочее, дабы сделать более чистый выход звука,
я являюсь противником данного метода, т.к. всегда приводило к жестяному и не живому звуку.
Делайте перезапуск интерфейса, что бы не ждать долгой перезагрузки, изменения так же вступают в силу
su
am restart
Сообщение отредактировал derak1129 — 08.07.21, 14:02
Подробная инструкция по настройке ALSA
На выходе получите высококачественнее звук
Смена звуковой карты, если имеется 2
Наличие и номер звуковых карт можно проверить командой в терминале
cat /proc/asound/modules
Если выдало к примеру, 0 стандартная карта, 1 адаптированная для музыки именно она должна поддерживать 32 или 24 битную обработку и 192000 дискритизацию, хотя бывает что и стандартная не плохо себя ведет на такой обработке.
0 mtkcard
1 hdcard
# по умолчанию 0, пишем 0 или 1 взависмости от наличия карт
defaults.ctl.card 0
defaults.pcm.card 0
defaults.pcm.device 0
Находим и меняем данные строки
сильно влияет на звук
defaults.pcm.dmix.rate 48000 #повышем до 96000 / 192000 , насколько система позволяет
defaults.pcm.dmix.format «U16_LE» #формат обработки рекомендую использовать U32_LE или U24_3LE U18_3LE
Значения выше, высокие и средние поднимаются, если в минус басса больше, менять default
Функция значительно преображает звук, по умолчание 16, если спустить на 0 и ниже звук будет бассистым, наоборот ввысьвысокие и средние выражаются, более четкий
менять default
Сообщение отредактировал Roman_city — 28.09.17, 16:54
Библиотеки Beats
Оригинал, но тут расширенная версия
Данные операции над устройством безопасны, то есть они не приведут к крашам и вечным загрузкам устройства!
Работают на arm/arm64/x86
Не пихайте сразу все, они очень сильно влияют звук даже при малейшем изменении, можно испортить так и повысить звучание
Установка: всем файлам права 0644, папкам 0755, исключение /bin/все файлы, права 0755
Внутри лежит файл для добавления эффектов в audio_effects.conf
Внутри архива папка beats_expansion, в ней находятся все остальные конфигурации звука
Файлы с расширением /etc/*.bin бросайте в /system/etc с правами 0644, рекомендую использовать по 1 из каждого подраздела bas,dyn,img,peq (может одного хватит)
Список основных либов к которым поодключаются все остальные настройки и либы /system/lib:
/system/lib/soundfx/libbeatsbass.so
/system/lib/soundfx/libsrsfx.so
/system/lib/soundfx/libsrstb.so
Описание эффектов:
/etc/*.bin конфигурация выходного звука,
В папке /etc/soundimage лежат основные настройки для SRS, эквализируют звук, бассбусты, усилетели голоса и высоких и т.д., копируйте в /system/etc/soundimage с правами 0644
Из названия разберетесь
В папке /etc/audio, файлы, которые копрессируют, лимитируют и выравнивают АЧХ выходного сигнала.
/system/bin/sound лимитер
/system/lib/soundfx/libbeatsbass.so усилитель басса
/system/lib/soundfx/libsrsfx.so накладвает эффекты расширение стерео образа, реверб, дисторшен и т.д.
/system/lib/soundfx/libsrstb.so Что то вроде компрессора
/system/lib/soundfx/libsrscore.so помогает libsrsfx.so, компрессирует звук
/system/lib/soundfx/libbeatscorehtc.so помогает libbeatsbass.so
/system/lib/soundfx/libharmancorehtc.so возбуждает высокий спектр частот, голоса чище звучат
Сообщение отредактировал Roman_city — 14.10.17, 14:41
Выставил дискретизацию 384000, звук не пропал, смарт redmi 3s, проц снап 430.
Сообщение отредактировал rv.e.a — 12.10.17, 07:33
Настройка и эквализация звука в SRS Processing
Ставится в основном на бюджетных моделях, может ошибаюсь (как пример взял от Leagoo M8)
Возможно у кого то она заработает без наличия данной библиотеки
Наличие проверяется, нахождением файлов: в /system/lib/libsrsprocessing.so ../system/data/srs_processing.cfg (иногда он находисят в etc)
Версия самой программы, включение программы или нет и уровень усиления выходного сигнала
// BLOCK: srs_cfg
// Config — Non-IP Configuration
:srs_skip = 1 #Пропускает любую обработку SRS 0 -нет, 1 — да
:trumedia_enable = 0 #включен или нет
:trumedia_preset = 0 #какую использует предустановку, 0 — music ,1 — movie, 2 — podcast
:trumedia_igain_int = 1.000
:trumedia_igain_ext = 1.000
:vol_int_enable = 0 #регулирования объема
:trumedia_skip = 0
Tru Bass — строка эмулирует вертикальный басовый звук
srs_mus_int:
:wowhd_igain = 0.600 #усиление звука на входе
:wowhd_ogain = 1.000 #усиление звука на выходе
:wowhd_trubass_enable = 0 #включение отключение 0-1
:wowhd_trubass_min = 0.000 #минимальная частота воздействия в герцах
:wowhd_trubass_window = 1.000 #размер
:wowhd_trubass_slide = 0.000 #насколько будет сглажен
:wowhd_trubass_slide_udef = 0.000 #практически делает то же самое, что и slide
:wowhd_trubass_compressor = 0.000 #компрессор, срезает лишние частоты, возвышающие выше 0дб
// ALIAS :wowhd_trubass_size // TruBass Speaker Size
:wowhd_trubass_freq = 500 #основная частота на которую воздействует — частота
:wowhd_trubass_analysis = 300 #размер анализа — частота
:wowhd_trubass_sa_enable = 1 #включение отключение сплит анализа
:wowhd_trubass_mode = 0 #Тру басс мод (0 — моно, 1 — стерео)
:wowhd_xover_enable = 1 #частота среза фильтра для динамика
:wowhd_xover_order = 4 # степень воздействия (максимум — 6)
:wowhd_xover_freq = 750 #частота (рекомендую 250)
:wowhd_hpf_enable = 1 #Hi pass Фильтр — обрезает частоты ниже установленной фильтра
:wowhd_hpf_order = 4 #степень воздействия (максимум — 6)
:wowhd_hpf_freq = 250 #частота
:wowhd_srs_enable = 0 #SRS3D — создает ощущение 3D
:wowhd_srs_space = 0.700 #воздействие на правый и левый канал
:wowhd_srs_center = 0.500 #воздействие по центру
:wowhd_srs_mode = 1 #(0-моно, 1-один динамик, 2-стерео, 3-экстрим
:wowhd_srs_speaker = 0 #тип звука (0 — динамик, 1 — наушники)
:wowhd_focus_enable = 0 #включение отключение фокуса
:wowhd_focus = 0.170 #Степень воздействие фокуса
:wowhd_definition_enable = 0 #четкость звука 0-1
:wowhd_definition_min = 0.000 #минимальная степень воздействия
:wowhd_definition_window = 0.500 #размер
:wowhd_definition_slide = 0.000 #
:wowhd_definition_slide_udef = 0.100 #
:wowhd_widesur_enable = 0 #сключает расширение стерео образа
:wowhd_widesur_igain = 1.000 #усиление
:wowhd_widesur_centerboost = 0.500 #усиление по центру
:wowhd_widesur_separation = 0.500 #степень смешивания звука
:wowhd_skip = 0 #пропуск эффектов или нет 0 нет, 1 да
Источник