Le traitement de l'Entrée Microphone

J'essaie d'obtenir des données audio à partir du microphone. J'ai réalisé cela en utilisant le AudioRecord classe qui remplit un tampon de type short.

J'aimerais un jour graphique de ce tampon, de sorte que je reçois un oscilloscope comme (affichage des informations en temps réel). Le problème est que si je veux afficher une valeur (disons dans le texte), alors j'ai besoin d'un autre thread pour mettre à jour l'INTERFACE utilisateur. Actuellement, je suis en train de faire cela en utilisant un AsyncTask et la mise à jour de l'INTERFACE utilisateur avec AsyncTasks.publishProgress(). Jusqu'à présent, je n'ai pas été très réussie et voudrais savoir si je suis sur la bonne voie? Sont gère une meilleure façon d'aller? Est qu'il ya quelqu'un qui a fait quelque chose de semblable auparavant, et si oui, quelle méthode a fonctionné pour vous? Aussi, est-il possible de simplement interroger le microphone?


Voici mon code. Il est destiné à la sortie de chaque lecture d'échantillons à partir du microphone. Il apparaît pour ce faire à un taux acceptable, mais parfois il affiche un zéro. Pourquoi?

package com.ss.audioacquireapp3;
import android.app.Activity;
import android.content.Context;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class AudioAcquireApp3Activity extends Activity 
{
//Properties (AsyncTask)
protected TextView _percentField;
protected InitTask _initTask;
//Properties (MIC)
public AudioRecord audioRecord; 
public int mSamplesRead; //how many samples read 
public int recordingState;
public int buffersizebytes; 
public int channelConfiguration = AudioFormat.CHANNEL_IN_MONO; 
public int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; 
public static short[] buffer; //+-32767 
public static final int SAMPPERSEC = 44100; //samp per sec 8000, 11025, 22050 44100 or 48000
@Override
public void onCreate( Bundle savedInstanceState ) 
{
super.onCreate(savedInstanceState);
setContentView( R.layout.main );
_percentField = ( TextView ) findViewById( R.id.percent_field );
buffersizebytes = AudioRecord.getMinBufferSize(SAMPPERSEC,channelConfiguration,audioEncoding); //4096 on ion 
buffer = new short[buffersizebytes]; 
audioRecord = new AudioRecord(android.media.MediaRecorder.AudioSource.MIC,SAMPPERSEC,channelConfiguration,audioEncoding,buffersizebytes); //constructor 
_initTask = new InitTask();
_initTask.execute( this );
}
/**
* sub-class of AsyncTask
*/
protected class InitTask extends AsyncTask<Context, Integer, String>
{
//-- run intensive processes here
//-- notice that the datatype of the first param in the class definition matches the param passed to this method 
//-- and that the datatype of the last param in the class definition matches the return type of this method
@Override
protected String doInBackground( Context... params ) 
{
//-- on every iteration
//-- runs a while loop that causes the thread to sleep for 50 milliseconds 
//-- publishes the progress - calls the onProgressUpdate handler defined below
//-- and increments the counter variable i by one
//int i = 0;
audioRecord.startRecording();
while( true ) 
{
try{
mSamplesRead = audioRecord.read(buffer, 0, buffersizebytes);
int amp;
for(int i = 0; i < buffersizebytes - 1; i++){
amp = (int)buffer[i];
publishProgress( amp );
}
} catch( Exception e ){                        
}
}
}
//-- gets called just before thread begins
@Override
protected void onPreExecute() 
{
//Log.i( "makemachine", "onPreExecute()" );
super.onPreExecute();
}
//-- called from the publish progress 
//-- notice that the datatype of the second param gets passed to this method
@Override
protected void onProgressUpdate(Integer... values) 
{
super.onProgressUpdate(values);
//Log.i( "makemachine", "onProgressUpdate(): " +  String.valueOf( values[0] ) );
_percentField.setText( String.valueOf(values[0]) );
}
//-- called as soon as doInBackground method completes
//-- notice that the third param gets passed to this method
@Override
protected void onPostExecute( String result ) 
{
super.onPostExecute(result);
//Log.i( "makemachine", "onPostExecute(): " + result );
}   
} 
}

Et c'est ici main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical|center_horizontal"
>
<TextView android:id="@+id/percent_field"
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:gravity="center_horizontal"/>
</LinearLayout>

Notez que vous devez ajouter à AndroidManifest.xml

<uses-permission android:name="android.permission.RECORD_AUDIO" />

Je suis en cours d'exécution sur une LG Optimus Black. Merci de m'aider à rendre ce code plus efficace possible.

OriginalL'auteur user893825 | 2011-08-14