2016-05-31 8 views
1

Ich baue eine Android-Anwendung, die die Aufnahme von Audio beginnen sollte, wenn der aufgenommene Sound über einem bestimmten Schwellenwert ist.Wie analysiert man den Wert von der MediaRecorder.getMaxAmplitude() in Android

Ich recherchierte und fand heraus, dass die Methode getMaxAmplitude() der MediaRecorder-Klasse eine Schätzung der Lautstärke des Rauschens als Maß für den Schalldruck gibt. Es gibt einen Wert zwischen 0 und +32767 zurück.

Hier ist der Code, den ich geschrieben habe.

MediaRecorder mediaRecorder = new MediaRecorder(); 
while(True){ 
    if (mediaRecorder.getMaxAmplitude() > THRESHOLD) 
     System.out.println("Recording sound"); 
    else 
     System.out.println("Sound recording not above the threshold level); 
} 

Ich habe Probleme den THRESHOLD-Wert herauszufinden, da es keine Standard-Einheit für den Wert der getMaxAmplitude() Funktion zurückgegeben wird. Es wäre vorzuziehen, wenn jemand eine Umwandlung von dem Wert vorschlagen könnte, der von der Funktion getMaxAmplitude() an Dezibel (dB) oder irgendeine andere nützliche Einheit zurückgegeben wird.

+0

Auch ich versuche eine Antwort auf diese Frage zu finden. Wenn ich mir eins ausdenke, werde ich es als Antwort posten. – aditya

Antwort

2

Es gibt keine einfache Möglichkeit, die Ausgabe von getMaxAmplitude() zu interpretieren, da es Ihnen nur den maximalen Wert gibt, den die spezifische Hardware Ihres Telefons erhält. Leider stellt die Tatsache, dass ein Hersteller die Anforderungen des Android-Betriebssystems erfüllt, nicht sicher, dass Sie von jedem Mikrofon die gleiche Antwort erhalten. In der Tat haben nicht alle Geräte des gleichen Herstellers die gleiche Art von Mikrofon und somit wird nicht die gleiche Frequenzantwort oder Empfindlichkeit erhalten. Wenn Sie von dieser zusätzlichen (aber hardwareseitigen Schallintensität proportionalen) Einheit getMaxAmplitude() in dB konvertieren möchten, verwenden Sie einfach dB = 20log10(getMaxAmplitude()). Wenn Sie möchten, dass dies auf einer Vielzahl von Geräten funktioniert, rate ich Ihnen, eine Kalibrierungsstufe in Ihre App aufzunehmen, damit Sie einen dynamischen geräteabhängigen Schwellenwert anstelle eines absoluten Werts festlegen können. Vielleicht können Sie Ihre Schwelle als die Beziehung zwischen der Intensität, die Sie erhalten, wenn Sie kalibrieren, und der Intensität, die Sie in dem Moment erhalten, wenn Sie versuchen zu erfassen. Ich kenne die Besonderheiten deiner App nicht, aber wenn ich du wäre, hätte ich zumindest eines dieser beiden Dinge im Sinn, mit denen ich vergleichen könnte. Der Moment, wenn der Mikrofoneingang am ruhigsten ist und wenn er am stärksten gesättigt ist (vielleicht kannst du deinen eigenen lauten Sound erzeugen und ihn aufzeichnen)

+0

Ja, das macht sehr viel Sinn. Ich denke daran, die Kalibrierung auf diese Weise zu machen, benutze das Mikrofon des Telefons, um den Ton in einer ruhigen Umgebung aufzunehmen und benutze dann das Telefon, um einen Ton aufzunehmen, der vom Lautsprecher des Telefons erzeugt wird. Ich frage mich, wie eine Anwendung wie Sound Meter erstellt wird oder ob es eine API gibt, die Sound Meter bietet, um ihre berechneten Dezibelwerte zu verwenden. – aditya

+0

Wenn diese Antwort gut für Sie ist, markieren Sie sie bitte als akzeptiert, damit jeder weiß, dass dies die Lösung des Problems ist. Ich weiß nicht, wie Sound Meter Apps erstellt werden oder ob sie eine API für andere bereitstellen. Bitte suchen Sie danach und wenn Sie die Antwort nicht finden, bitte posten Sie eine andere Frage, damit wir beide herausfinden können – VMMF

+0

Ich möchte diese Antwort als richtig markieren, aber ich konnte das Problem nicht vollständig lösen . Ich habe eine Analyse durchgeführt und die Formel, die in der Frage spezifiziert ist, berechnet den Dezibelwert als 60 verglichen mit irgendwo um 45, berechnet von einer App wie Sound Meter. Ich möchte immer noch, dass andere antworten und meine eigenen Recherchen machen, bevor ich dies als die richtige Antwort bezeichne. – aditya

Verwandte Themen