Плохое качество звука при записи / воспроизведении звуков - Android SDK - PullRequest
6 голосов
/ 16 октября 2010

У меня проблема, когда я пытаюсь записать, а затем воспроизвести только что записанный файл. Я могу как записывать, так и воспроизводить звук, но качество воняет. Его не просто плохо, его действительно трудно слушать, и он звучит немного похоже на компьютерный голос. Я использую andriod SDK-эмулятор. Код для настройки записи выглядит так:

MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(path);
recorder.prepare();
recorder.start();

И код, воспроизводящий файл позже, выглядит так:

MediaPlayer mp = new MediaPlayer();
mp.reset();
mp.setDataSource(path);
mp.prepare();
mp.start();

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

Ответы [ 4 ]

4 голосов
/ 30 апреля 2012

Попробуйте это

recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);   
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);     
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);   
recorder.setAudioChannels(2);
recorder.setAudioEncodingBitRate(128);
recorder.setAudioSamplingRate(44100);

Если вы обнаружите сбой кода на устройствах с низким уровнем Android, попробуйте удалить setAudioChannels и setAudioSamplingRate.

3 голосов
/ 27 октября 2015

Это не просто эмулятор; на моем Nexus 10 это тоже звучит плохо.

Как и в ответе Мохита Марвала, вы можете установить частоту дискретизации и битрейт. 44100 - стандартная частота дискретизации с качеством CD. Большинство коммерческих загрузок аудио кодируются со скоростью не менее 128000 бит в секунду (не килобит в секунду, как показано в ответе Мохита). Так что это были бы хорошие начальные значения. Кроме того, вы должны использовать только один канал, чтобы сократить размер файла вдвое, если у вас нет стереомикрофона и вам нужна запись в стерео.

recorder.setAudioChannels(1);
recorder.setAudioEncodingBitRate(128000);
recorder.setAudioSamplingRate(44100);

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

1 голос
/ 16 ноября 2010

Вы говорите о двух разных объектах, AudioRecorder и MediaRecorder.

0 голосов
/ 18 октября 2010

AudioRecord принимает множество аргументов, которые могут повлиять на качество записи.

Попробуйте установить их в конструкторе:

  • Источник звука: MIC
  • Частота дискретизации: 16000
  • Количество каналов: CHANNEL_CONFIGURATION_MONO
  • Формат: ENCODING_PCM_16BIT
  • Размер буфера: 16000 * 30 (30 секундный буфер)

Пример кода:

recorder = new AudioRecord(
                          MediaRecorder.AudioSource.MIC,
                          16000,
                          AudioFormat.CHANNEL_CONFIGURATION_MONO,
                          AudioFormat.ENCODING_PCM_16BIT,
                          16000*30);
...