2013-01-06 15 views
24

Używanie MediaRecorder Przechwytywam dźwięk z mikrofonu urządzenia. Od dźwięku potrzebuję tylko analizować głośność dźwięku (głośność dźwięku), bez zapisywania dźwięku do pliku.Android: wykryj poziom dźwięku

dwa pytania:

  1. Jak mogę głośność ścieżki dźwiękowej w danym momencie?
  2. Jak wykonać analizę bez zapisywania dźwięku w pliku?

Dziękuję.

Odpowiedz

35
  1. Zastosowanie mRecorder.getMaxAmplitude();

  2. Do analizy dźwięku bez zapisywania wystarczy użyć mRecorder.setOutputFile("/dev/null");

Here's przykładem, mam nadzieję, że to pomoże

public class SoundMeter { 

    private MediaRecorder mRecorder = null; 

    public void start() { 
      if (mRecorder == null) { 
        mRecorder = new MediaRecorder(); 
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
        mRecorder.setOutputFile("/dev/null"); 
        mRecorder.prepare(); 
        mRecorder.start(); 
      } 
    } 

    public void stop() { 
      if (mRecorder != null) { 
        mRecorder.stop();  
        mRecorder.release(); 
        mRecorder = null; 
      } 
    } 

    public double getAmplitude() { 
      if (mRecorder != null) 
        return mRecorder.getMaxAmplitude(); 
      else 
        return 0; 

    } 
} 
+1

Podoba mi się/dev/null, ale nie rozumiem, jak uzyskać MaxAmplitude kilka razy na sekundę. –

+1

Potrzebuję ciągłego rejestrowania poziomu dźwięku (100 razy na sekundę). Nagrany poziom dźwięku (głośność) powinien być od momentu, w którym go nagrałem. –

+0

Rozwiązałem. Zwroty getMaxAmplitude() są wyjaśnione w następujący sposób na stronie internetowej poświęconej rozwojowi Androida: maksymalna bezwzględna amplituda zmierzona od ostatniego połączenia, lub 0 po raz pierwszy wywołana, i aby uzyskać dowolną sekundę tę wartość użyłem Timera. –

3

Grałem z kilkoma aplikacjami kodu źródłowego do nagrywania dźwięku, ale do tego ok chwilę, aby go zdobyć.

Możesz skopiować kod źródłowy Google NoiseAlert - kod SoundMeter, z którego korzystałem.

getMaxAmplitude zawiera się w przedziale od 0 do 32768. EMA rzeczy, których nie używałem.

W swojej głównej działalności musisz zadeklarować obiekt MediaRecorder i wywołać jego funkcję start() zgodnie z cytowaną Anna.

Aby uzyskać więcej informacji, można odwołać się do mojego projektu: http://kaitagsd.wordpress.com/2013/03/25/arduino-project-amplify-part-2-i-e-how-to-transmit-send-data-from-android-to-arduino-bluesmirf-silver-using-bluetooth/ Gdzie Musiałem wysłać wartość amplitudy dźwięku przez Bluetooth.

Dokładny kod jest tutaj: https://github.com/garytse89/Amplify/tree/master/Android%20Code/src/com/garytse89/allin

Wystarczy przejrzeć części, które mają nic wspólnego z przedmiotem MediaRecorder związany.

+0

Strona http://kaitagsd.wordpress.com/2013/03/25/arduino-project-amplify-part-2-ie-how-to-transmit-send-data-from-android-to-arduino- bluesmirf-silver-using-bluetooth "nie jest już dostępny" zgodnie z Wordpress. –

6

Jeśli chcesz analizować próbki dźwięku pobranej bezpośrednio z mikrofonu bez zapisywania danych w pliku, należy skorzystać z obiektu AudioRecord następująco:

int sampleRate = 8000; 
try { 
    bufferSize = AudioRecord.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_IN_MONO, 
     AudioFormat.ENCODING_PCM_16BIT); 
    audio = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, 
      AudioFormat.CHANNEL_IN_MONO, 
      AudioFormat.ENCODING_PCM_16BIT, bufferSize); 
} catch (Exception e) { 
    android.util.Log.e("TrackingFlow", "Exception", e); 
} 

Wtedy trzeba zacząć nagrywanie gdy gotowe:

audio.startRecording(); 

teraz nadszedł czas, aby rozpocząć czytanie próbki w następujący sposób:

short[] buffer = new short[bufferSize]; 

    int bufferReadResult = 1; 

    if (audio != null) { 

     // Sense the voice... 
     bufferReadResult = audio.read(buffer, 0, bufferSize); 
     double sumLevel = 0; 
     for (int i = 0; i < bufferReadResult; i++) { 
      sumLevel += buffer[i]; 
     } 
     lastLevel = Math.abs((sumLevel/bufferReadResult)); 

Ostatni kod łączy wszystkie amplitudy próbek i przypisuje średnią do ostatniej zmiennej LeveL, aby uzyskać więcej szczegółów, można przejść do tej post.

Pozdrawiam!

+0

Algorytm jest uszkodzony - nie można dodać takich wartości, ponieważ są to podpisane wartości. Musisz wziąć * magnitudy * i uśrednić je. –

+0

@Martin: Czy "lastLevel" to MaxAmplitude? Właściwie muszę obliczyć wartość "dbValue" i "MeanLevelTotal" i nie używam wcześniej nagranego pliku. Pracuję nad nagraniem na żywo. –

Powiązane problemy