it-swarm.com.de

Android AudioRecord Unterstützte Abtastraten

Ich versuche herauszufinden, welche Abtastraten für Telefone mit Android 2.2 und höher unterstützt werden. Wir möchten mit einer niedrigeren Rate als 44,1 kHz abtasten und müssen nicht neu abtasten.
Ich weiß, dass alle Telefone 44100 Hz unterstützen, aber ich habe mich gefragt, ob es eine Tabelle gibt, die zeigt, welche Abtastraten für bestimmte Telefone gelten. Ich habe Android-Dokumentation gesehen ( http://developer.Android.com/reference/Android/media/AudioRecord.html ), aber es hilft nicht viel.
Hat jemand eine Liste dieser Abtastraten gefunden?

31
Summit

Das Originalposter ist wahrscheinlich längst weitergezogen, aber ich werde es posten, falls jemand diese Frage findet.

Leider kann jedes Gerät nach meiner Erfahrung unterschiedliche Abtastraten unterstützen. Der einzige sichere Weg, um herauszufinden, welche Abtastraten ein Gerät unterstützt, besteht darin, sie einzeln zu testen, indem geprüft wird, dass das Ergebnis von AudioRecord.getMinBufferSize () nicht negativ ist (was bedeutet, dass ein Fehler aufgetreten ist) und eine gültige minimale Puffergröße zurückgibt.

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

        }
    }
}
56
Yahma

Android verfügt über die Funktion AudioManager.getProperty(), um die minimale Puffergröße und die bevorzugte Abtastrate für die Audioaufnahme und -wiedergabe zu ermitteln. Ja, natürlich ist AudioManager.getProperty () auf API-Ebene <17 nicht verfügbar. Hier ist ein Beispiel-Codebeispiel für die Verwendung dieser 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);

Obwohl es eine späte Antwort ist, dachte ich, dass dies nützlich sein könnte.

14
Reaz Murshed

Leider unterstützen nicht alle Telefone die vermeintlich garantierte 44,1-kHz-Rate :(

Ich habe ein Samsung GalaxyY (GT-S5360L) getestet und wenn Sie von der Camcorder-Quelle (Ambience-Mikrofon) aufnehmen, werden nur 8kHz und 16kHz unterstützt. Die Aufnahme bei 44,1 kHz führt zu völligem Müll und bei 11,025 kHz zu einer tonhöhenveränderten Aufnahme mit etwas weniger Dauer als der Originalton.

Darüber hinaus schlagen beide von @Yahma und @Tom vorgeschlagenen Strategien auf diesem Telefon fehl, da es möglich ist, eine positive Mindestpuffergröße von einer nicht unterstützten Konfiguration zu erhalten. Schlimmer noch: Ich musste das Telefon zurücksetzen, um das Telefon zu erhalten Audiostack funktioniert wieder, nachdem versucht wurde, eine AudioRecord-Klasse zu verwenden, die mit Parametern initialisiert wurde, die eine angeblich gültige (nicht ausnahmebehaftete) AudioTrack- oder AudioRecord-Instanz erzeugen.

Ich bin ehrlich gesagt etwas besorgt über die Probleme, die ich mir vorstellen kann, wenn ich eine Sound-App in freier Wildbahn veröffentlicht. In unserem Fall sind wir gezwungen, eine kostspielige Sample-Rate-Conversion-Schicht einzuführen, wenn wir erwarten, dass unsere Algorithmen (die eine Aufzeichnungsrate von 44,1 kHz erwarten) bei diesem speziellen Telefonmodell wiederverwendet werden.

:(

13
user1222021

Ich habe ein Telefon (Acer Z3), bei dem ich eine positive Puffergröße von AudioRecord.getMinBufferSize (...) bekomme, wenn ich 11025 Hz teste. Wenn ich aber später renne

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

Ich kann sehen, dass diese Abtastrate tatsächlich keine gültige Konfiguration darstellt (wie vom Benutzer1222021 am 5. Juni '12 angegeben). Meine Lösung besteht also darin, beide Tests auszuführen, um eine gültige Abtastrate zu finden.

3
Jorg K

Diese Methode gibt die von Ihrem Gerät unterstützte MinimumAudio-Abtastrate an.

NOTE: Sie können die for-Schleife umkehren, um die von Ihrem Gerät unterstützte maximale - Abtastrate zu erhalten (Vergessen Sie nicht, den Methodennamen zu ändern).

HINWEIS 2 : Obwohl laut Android-Dokument bis zu 48.000 (48kHz) Abtastrate unterstützt wird, habe ich alle möglichen Abtastraten hinzugefügt (wie in Wikipedia), da wer weiß, dass neue Geräte UHD-Audio in höheren Frameraten (Sampling) aufnehmen.

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, 48000, 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;
}
2
Vigneshwaran.m

Ich möchte eine Alternative zu Yahmas Antwort geben. 

Ich stimme seinem/ihrem Vorschlag zu, dass es getestet werden muss (obwohl es vermutlich vom Modell abhängt, nicht vom Gerät), aber die Verwendung von getMinBufferSize erscheint mir etwas indirekt.

Um zu testen, ob eine gewünschte Abtastrate unterstützt wird, schlage ich vor, eine AudioTrack-Instanz mit der gewünschten Abtastrate zu erstellen. Wenn die angegebene Abtastrate nicht unterstützt wird, wird eine Ausnahme vom Formular angezeigt:

"Java.lang.IllegalArgumentException: 2756Hz ist keine unterstützte Abtastrate"

2
Tom

Nur ein paar aktualisierte Informationen hier. Ich habe einige Zeit versucht, über das Mikrofon auf Aufnahme zuzugreifen, um mit Android 6 zu arbeiten (4.4 KitKat war in Ordnung). Der angezeigte Fehler war derselbe wie bei 4.4, wenn falsche Einstellungen für die Samplerate/Pcm usw. verwendet wurden. Mein Problem war jedoch, dass die Berechtigungen in AndroidManifest.xml nicht mehr ausreichen, um Zugriff auf das Mikrofon und in der Tat dies zu beantragen Jetzt muss die Laufzeit ausgeführt werden: https://developer.Android.com/training/permissions/requesting.html

0
user5292841
    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;
    }

Dieser Code gibt Ihnen die maximal unterstützte Abtastrate für Ihr Android-Betriebssystem. Deklarieren Sie ArrayList <Integer> TrueMan; zu Beginn Ihrer Klasse. Dann können Sie in AudioTrack und AudioRecord eine hohe Abtastrate verwenden, um eine bessere Klangqualität zu erzielen. Referenz

0
Fatih Şennik