2010-02-13 7 views
32

Sto cercando di capire come scrivere un'app in grado di decodificare l'audio codice Morse al volo. Ho trovato this document che spiega come registrare audio dal microfono in Android. Quello che mi piacerebbe sapere è se è possibile accedere al raw input dal microfono o se deve essere scritto/letto su un file.Elaborazione audio in tempo reale su Android

Grazie.

+0

Hai mai fatto questo progetto Paul? Sto cercando qualcosa di simile a un progetto di "homer" e mi interessava anche l'elaborazione dell'audio in arrivo al volo .... forse è necessario utilizzare una libreria nativa per ottenere prestazioni sufficienti? mandami una mail se vuoi su andrew a mackenzie-serres.net. Grazie! –

risposta

22

Se si utilizza MediaRecorder (nell'esempio sopra), l'audio compresso verrà salvato su un file.

Se si utilizza AudioRecord, è possibile ottenere direttamente campioni audio.

Sì, ciò che si vuole fare dovrebbe essere possibile.

-2

Sembra che debba essere scaricato prima su un file.

Se si dà un'occhiata allo android.media.AudioRecord source, , i buffer di byte di dati audio nativi non sono esposti all'API pubblica.

Nella mia esperienza, avendo realizzato un sintetizzatore audio per Android, è difficile ottenere prestazioni in tempo reale e mantenere la fedeltà audio. Un "traduttore" del codice Morse è certamente fattibile, e suona come un piccolo progetto divertente. In bocca al lupo!

+0

Perché pensi che i buffer audio non siano passati a Java? Che dire del metodo read()? – dmazzoni

+0

-1 Non è necessario eseguire prima il dump su un file. –

6

L'uso di AudioRecord è eccessivo. Basta controllare MediaRecorder.getMaxAmplitude() ogni 1000 millisecondi per i rumori forti contro il silenzio.

Se è davvero necessario analizzare la forma d'onda, allora sì, è necessario AudioRecord. Ottieni i dati grezzi e calcola qualcosa come la media alla radice della parte dei byte grezzi di cui sei interessato per avere un'idea del volume.

Ma, perché tutto questo quando MediaRecorder.getMaxAmplitude() è molto più facile da usare.

vedere il mio codice da questa risposta: this question

+0

1000 ms = 1 s, che non sembra abbastanza spesso sufficiente per l'analisi del codice Morse. – StockB

+2

Ma non puoi usare getMaxAmplitude() (beh puoi, ma otterrai sempre 0) a meno che non inizi effettivamente a registrare. Quindi dovresti ancora registrare un file, che potrebbe crescere all'infinito. Sicuramente non è una soluzione. – matteo

5

esiste un quadro di rilevamento dai laboratori MIT Media chiamato Funf: http://code.google.com/p/funf-open-sensing-framework/
Hanno già classi create per l'ingresso audio e un po 'di analisi (FFT e simili), anche il risparmio per i file o il caricamento è implementato per quanto ho visto, e gestiscono la maggior parte dei sensori disponibili sul telefono. Puoi anche ispirarti al codice che hanno scritto, che ritengo sia abbastanza buono.