Intereting Posts
Как получить информацию о широте и долготе из изображения Нет стиля ViewPagerIndicator в сочетании с SherlockActionBar Недавно появилось много NPE DeviceMotionService Связывание с обновленной библиотекой на Android Сила Android Горизонтальная (ландшафтная) компоновка Android M, запрашивающий разрешения с правами доступа Строки, похоже, не равны в Java на Android, хотя они печатают одинаковые Как изменить фон названия Android Alert Dialog Атрибут манифеста Android не разрешен здесь Может ли Android-кеш-видео HTML5 с отключенным кэшем? Отключить один ключ на пользовательской клавиатуре на Android Удаление событий из Календаря, которые не удаляются Включить / отключить подключение к данным в программном обеспечении Android Как сделать панель контекстного ActionMode наложением панели инструментов appcompat-v7, но не ящиком навигации? Поддержание режима «подсветки» (View.setSystemUiVisibility) через перезагрузки

Android AudioRecord, какие настройки для записи вызова

Я использую класс AudioRecord для записи голоса во время разговора.

Меня интересует запись только голоса человека, которому принадлежит телефон (из микрофона). Во время записи я хотел бы сделать некоторую обработку звука, но сейчас это оффтоп.

Android имеет следующие параметры AudioSources:

  • MediaRecorder.AudioSource.VOICE_CALL
  • MediaRecorder.AudioSource.MIC
  • MediaRecorder.AudioSource.VOICE_UPLINK
  • MediaRecorder.AudioSource.VOICE_DOWNLINK

Можете ли вы объяснить, каковы различия между ними. ОК MIC очевидна, но VOICE_CALL против VOICE_UPLINK против VOICE_DOWNLINK?

Также я должен выбрать частоту дискретизации (8000 Гц, 16000 Гц, 2250 Гц, 44100 Гц). Не могли бы вы рассказать мне, какую выборку выбрать и почему?

Для аудиоформата я выбрал AudioFormat.ENCODING_PCM_16BIT, но он также имеет: – AudioFormat.ENCODING_DEFAULT – AudioFormat.ENCODING_INVALID – AudioFormat.ENCODING_PCM_8BIT

Наконец, сколько каналов я должен использовать и почему? (AudioFormat.CHANNEL_IN_STEREO или AudioFormat.CHANNEL_IN_MONO)

Solutions Collecting From Web of "Android AudioRecord, какие настройки для записи вызова"

Вы всегда должны стремиться использовать 44100 в качестве частоты дискретизации, так как это единственная частота дискретизации, которая, как гарантируется, будет работать в соответствии с Google.

«Частота дискретизации, выраженная в герцах 44100 Гц, в настоящее время является единственной нормой, которая гарантирована для работы на всех устройствах, но другие скорости, такие как 22050, 16000 и 11025, могут работать на некоторых устройствах». Сайт Dev

Что касается стерео или моно, используйте моно.

»Описывает конфигурацию аудиоканалов. См. CHANNEL_IN_MONO и CHANNEL_IN_STEREO. Гарантируется, что CHANNEL_IN_MONO будет работать на всех устройствах." Сайт Dev

Наконец: 8bit pcm vs 16bit pcm: используйте 16bit pcm,

«Формат аудиоданных: PCM 16 бит на образец. Гарантируется поддержка устройств». Сайт Dev

Не забудьте использовать короткий буфер [] вместо байтового буфера при использовании 16 бит. Поскольку 16 бит – это 2 байта, вам придется объединить две записи в буфере за раз:

Byte] [] {sample_1_upper, sample_1_lower, sample_2_upper, sample_2_lower, …, sample_n_lower} Однако, если вы будете использовать короткий [] буфер:
Short [] {sample1, sample2, …, sample3}

Я никогда не пытался записать вызов, но если ОС не связывает источник MIC, вы, вероятно, можете записать его. Поскольку вы записываете с микрофона, вы должны получать голос только от пользователей.

Можете ли вы объяснить, каковы различия между ними. ОК MIC очевидна, но VOICE_CALL против VOICE_UPLINK против VOICE_DOWNLINK?

VOICE_UPLINK: аудио, переданное с вашего конца другой стороне. IOW, что вы говорите в микрофон (плюс окружающий шум в зависимости от того, используется ли подавление шума и насколько хорошо он работает).

VOICE_DOWNLINK: аудио передается от другой стороны до конца.

VOICE_CALL: VOICE_UPLINK + VOICE_DOWNLINK.

Немного поздно, но вы можете запросить звуковое устройство, чтобы узнать, что он может сделать;

AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); String sampleRate = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE); String sampleBufferSize = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER); int bufferSize = AudioRecord.getMinBufferSize(Integer.parseInt(sampleRate), AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);