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
Vous devez vous connecter pour publier un commentaire.
Activity.runOnUiThread(Runnable action)
. VoirActivity
classe javadoc pour plus de détails.AudioRecord
est une bonne façon d'aller, lors de l'enregistrement de micrphone. Voici un lien pour exemple de mise en œuvre, qui se lit de la fréquence de l'audio enregistré live: http://www.anddev.org/novice-tutorials-f8/get-frequency-data-from-microphone-in-real-time-t16774.htmlEspère que cette aide.
Eh bien, il est difficile de vous aider sans voir le code. Trouver la pice de code qui est exécuté le plus souvent (c'est à dire dans AsyncTask.run()) et de l'optimiser, par exemple: supprimer les Journaux de débogage, longues opérations etc.
J'ai posté mon code. Étais-je censée saisir ici, plutôt que comme une réponse? Merci 🙂
OriginalL'auteur pkk
C'est une réponse tardive mais, peut-être que quelqu'un a besoin d'une réponse à la même question. Ici est Open Source Android Oscilloscope (OsciPrime) lien (http://android.serverbox.ch/?p=268). Le code source utilise le Fil au lieu de AsyncTask. Si vous consultez le code source, vous pouvez comprendre comment Thread gère le AudioRecord avec Looper et de Gestionnaire. J'espère que cela est utile à d'autres 🙂
OriginalL'auteur user689072