Подтвердить что ты не робот

Android AudioRecord поддерживает частоту дискретизации

Я пытаюсь выяснить, какие частоты выборки поддерживаются для телефонов под управлением Android 2.2 и выше. Мы хотели бы попробовать со скоростью ниже 44,1 кГц, и вам не придется перепробовать.
Я знаю, что все телефоны поддерживают 44100 Гц, но было интересно, есть ли там таблица, показывающая, какие частоты выборки действительны для определенных телефонов. Я видел документацию на Android ( http://developer.android.com/reference/android/media/AudioRecord.html), но это мало помогает.
Кто-нибудь нашел список этих частот дискретизации??

4b9b3361

Ответ 1

Оригинальный плакат, возможно, давно уже перешел, но я отправлю его, если кто-нибудь еще найдет этот вопрос.

К сожалению, по моему опыту, каждое устройство может поддерживать разные частоты дискретизации. Единственный верный способ узнать, какие частоты дискретизации поддерживает устройство, - это проверить их индивидуально, проверив результат AudioRecord.getMinBufferSize() не отрицательно (это означает, что произошла ошибка) и возвращает допустимый минимальный размер буфера.

public void getValidSampleRates() {
    for (int rate : new int[] {8000, 11025, 16000, 22050, 44100}) {  // add the rates you wish to check against
        int bufferSize = AudioRecord.getMinBufferSize(rate, AudioFormat.CHANNEL_CONFIGURATION_DEFAULT, AudioFormat.ENCODING_PCM_16BIT);
        if (bufferSize > 0) {
            // buffer size is valid, Sample rate supported

        }
    }
}

Ответ 2

К сожалению, даже не все телефоны поддерживают гарантированную скорость 44,1 кГц: (

Я тестировал Samsung GalaxyY (GT-S5360L), и если вы записываете из источника Camcorder (микрофон окружения), поддерживаются только 8 кГц и 16 кГц. Запись @44.1kHz создает полный мусор, а @11.025kHz производит запись с изменением высоты тона с немного меньшей продолжительностью, чем исходный звук.

Кроме того, обе стратегии, предложенные @Yahma и @Tom, не срабатывают на этом конкретном телефоне, так как можно получить положительный размер минимального буфера из неподдерживаемой конфигурации, и, что еще хуже, я был вынужден reset телефон, чтобы снова восстановить фоновый стек, пытаясь использовать класс AudioRecord, инициализированный из параметров, которые производят предположительно действительный экземпляр AudioTrack или AudioRecord.

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

: (

Ответ 3

Android имеет функцию AudioManager.getProperty() для получения минимального размера буфера и получения предпочтительной частоты дискретизации для аудиозаписи и воспроизведения. Но да, конечно, AudioManager.getProperty() недоступен на уровне API < 17. Здесь пример пример кода о том, как использовать этот API.

// To get preferred buffer size and sampling rate.
AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
String rate = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
String size = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
Log.d("Buffer Size and sample rate", "Size :" + size + " & Rate: " + rate);

Хотя его поздний ответ, я думал, что это может быть полезно.

Ответ 4

У меня есть телефон (Acer Z3), где я получаю положительный размер буфера, возвращенный из AudioRecord.getMinBufferSize(...) при тестировании 11025 Гц. Однако, если впоследствии я запустил

audioRecord = new AudioRecord(...);
int state = audioRecord.getState();
if (state != AudioRecord.STATE_INITIALIZED) ...

Я вижу, что эта частота дискретизации фактически не представляет допустимую конфигурацию (как указано пользователем1222021 от 5 июня 12). Поэтому мое решение - запустить оба теста, чтобы найти допустимую частоту дискретизации.

Ответ 5

Я хотел бы предоставить альтернативу ответам Яхмы.

Я согласен с его предложением о том, что он должен быть протестирован (хотя, по-видимому, он варьируется в зависимости от модели, а не от устройства), но использование getMinBufferSize кажется немного косвенным для меня.

Чтобы проверить, поддерживается ли желаемая частота дискретизации, я предлагаю создать экземпляр AudioTrack с требуемой частотой дискретизации - если указанная частота дискретизации не поддерживается, вы получите исключение из формы:

"java.lang.IllegalArgumentException: 2756Hz не поддерживается частотой дискретизации"

Ответ 6

Этот метод дает минимальную частоту дискретизации, поддерживаемую вашим устройством.

ПРИМЕЧАНИЕ. Вы можете отменить цикл for, чтобы получить максимальную скорость опроса максимум, поддерживаемую вашим устройством (не забудьте изменить имя метода).

ПРИМЕЧАНИЕ 2. Несмотря на то, что поддержка android doc поддерживает скорость выборки до 48000 (48 кГц), я добавил все возможные частоты дискретизации (как в wikipedia), так как кто знает, что новые устройства могут записывать звук UHD в более высоких (выборки) кадров.

private int getMinSupportedSampleRate() {
    /*
     * Valid Audio Sample rates
     * 
     * @see <a
     * href="http://en.wikipedia.org/wiki/Sampling_%28signal_processing%29"
     * >Wikipedia</a>
     */
    final int validSampleRates[] = new int[] { 8000, 11025, 16000, 22050,
            32000, 37800, 44056, 44100, 47250, 4800, 50000, 50400, 88200,
            96000, 176400, 192000, 352800, 2822400, 5644800 };
    /*
     * Selecting default audio input source for recording since
     * AudioFormat.CHANNEL_CONFIGURATION_DEFAULT is deprecated and selecting
     * default encoding format.
     */
    for (int i = 0; i < validSampleRates.length; i++) {
        int result = AudioRecord.getMinBufferSize(validSampleRates[i],
                AudioFormat.CHANNEL_IN_DEFAULT,
                AudioFormat.ENCODING_DEFAULT);
        if (result != AudioRecord.ERROR
                && result != AudioRecord.ERROR_BAD_VALUE && result > 0) {
            // return the mininum supported audio sample rate
            return validSampleRates[i];
        }
    }
    // If none of the sample rates are supported return -1 handle it in
    // calling method
    return -1;
}

Ответ 7

    public  class Bigestnumber extends AsyncTask<String, String, String>{
        ProgressDialog pdLoading = new ProgressDialog(MainActivity.this);

        @Override
        protected String doInBackground(String... params) {
            final int validSampleRates[] = new int[]{
                    5644800, 2822400, 352800, 192000, 176400, 96000,
                    88200, 50400, 50000, 48000,47250, 44100, 44056, 37800, 32000, 22050, 16000, 11025, 4800, 8000};
            TrueMan = new ArrayList <Integer> ();
            for (int smaple : validSampleRates){
                if(validSampleRate(smaple) == true) {
                    TrueMan.add(smaple);
                }}


            return null;
        }
        @Override
        protected void onPostExecute(String result) {

            Integer largest = Collections.max(TrueMan);
            System.out.println("Largest   " + String.valueOf(largest));



        }

    }

   public boolean validSampleRate(int sample_rate) {
        AudioRecord recorder = null;
        try {
            int bufferSize = AudioRecord.getMinBufferSize(sample_rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
            recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sample_rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);
        } catch(IllegalArgumentException e) {
            return false;
        } finally {
            if(recorder != null)
                recorder.release();
        }
        return true;
    }

Этот код предоставит вам Max Supported Sample Rate на вашей ОС Android. Просто объявите ArrayList <Integer> TrueMan; в своем начале класса. Затем вы можете использовать высокую частоту дискретизации в AudioTrack и AudioRecord для улучшения качества звука. Ссылка.

Ответ 8

Просто обновленная информация здесь. Я потратил некоторое время, пытаясь получить доступ к записи с микрофона для работы с Android 6 (4.4 KitKat был в порядке). Показанная ошибка была такой же, как у меня для 4.4 при использовании неправильных настроек для частоты дискретизации /pcm и т.д. Но моя проблема заключалась в том, что разрешений в AndroidManifest.xml уже недостаточно для запроса доступа к микрофону, и на самом деле это теперь нужно сделать время выполнения: https://developer.android.com/training/permissions/requesting.html