Error en la implementación de Android Visualizer

Estoy intentando implementar la clase Visualizer de Android. He buscado otros problemas de hilos, pero todavía estoy recibiendo un error fatal. Todo esto me parece que debería funcionar correctamente, por alguna razón el AVD sigue fallando.

En primer lugar, estoy usando los permisos:

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

Aquí está mi logcat:

 12-21 15:10:46.983: D/dalvikvm(642): Not late-enabling CheckJNI (already on) 12-21 15:10:48.823: D/MediaPlayer(642): Couldn't open file on client side, trying server side 12-21 15:10:53.603: E/AudioEffect(642): set(): AudioFlinger could not create effect, status: -22 12-21 15:10:53.603: E/visualizers-JNI(642): Visualizer initCheck failed -4 12-21 15:10:53.613: E/Visualizer-JAVA(642): Error code -4 when initializing Visualizer. 12-21 15:10:53.613: E/Visual Ex(642): Cannot initialize Visualizer engine, error: -4 12-21 15:10:53.964: D/gralloc_goldfish(642): Emulator without GPU emulation detected. 

Y mi código:

 package MediaPlayer.namespace; import java.io.IOException; import android.app.Activity; import android.media.MediaPlayer; import android.media.MediaRecorder; import android.media.audiofx.Visualizer; import android.net.Uri; import android.os.Bundle; import android.util.Log; public class MediaPlayerActivity extends Activity { Visualizer visual; int formattedVizData[]; byte rawWaveForm[]; int cont = 0xFF; public void onCreate(Bundle savedInstanceState) { //start super.onCreate(savedInstanceState); setContentView(R.layout.main); ///start media player & visualizer. MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer = MediaPlayer.create(this, Uri.parse("http://vprbbc.streamguys.net:80/vprbbc24.mp3")); mediaPlayer.start(); // Create the Visualizer object and attach it to our media player. try{ visual = new Visualizer(mediaPlayer.getAudioSessionId()); // this line causing Exception visual.setEnabled(true); visual.setCaptureSize(Visualizer.getCaptureSizeRange()[1]); } catch(Exception ex) { Log.e("Visual Ex", ex.getMessage()); } } } 

Tengo el mismo problema, así que trate de agregar permiso en el archivo AndroidManifest.xml

También si no quieres ver esa onda de audi, deberías mostrarla en lienzo o algo así …

Ejemplo de trabajo:

 //android.permission.MODIFY_AUDIO_SETTINGS for audio settings and also //android.permission.INTERNET for internet streaming package com.janilemy; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.audiofx.Visualizer; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.TextView; import java.io.IOException; public class AudioFxDemoActivity extends Activity { //Here is your URL defined String url = "http://vprbbc.streamguys.net/vprbbc24.mp3"; //Constants for vizualizator - HEIGHT 50dip private static final float VISUALIZER_HEIGHT_DIP = 50f; //Your MediaPlayer MediaPlayer mp; //Vizualization private Visualizer mVisualizer; private LinearLayout mLinearLayout; private VisualizerView mVisualizerView; private TextView mStatusTextView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //Info textView mStatusTextView = new TextView(this); //Create new LinearLayout ( because main.xml is empty ) mLinearLayout = new LinearLayout(this); mLinearLayout.setOrientation(LinearLayout.VERTICAL); mLinearLayout.addView(mStatusTextView); //set content view to new Layout that we create setContentView(mLinearLayout); //start media player - like normal mp = new MediaPlayer(); mp.setAudioStreamType(AudioManager.STREAM_MUSIC); try { mp.setDataSource(url); // set data source our URL defined } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { //tell your player to go to prepare state mp.prepare(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //Start your stream / player mp.start(); //setup your Vizualizer - call method setupVisualizerFxAndUI(); //enable vizualizer mVisualizer.setEnabled(true); //Info text mStatusTextView.setText("Playing audio..."); } //Our method that sets Vizualizer private void setupVisualizerFxAndUI() { // Create a VisualizerView (defined below), which will render the simplified audio // wave form to a Canvas. //You need to have something where to show Audio WAVE - in this case Canvas mVisualizerView = new VisualizerView(this); mVisualizerView.setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, (int)(VISUALIZER_HEIGHT_DIP * getResources().getDisplayMetrics().density))); mLinearLayout.addView(mVisualizerView); // Create the Visualizer object and attach it to our media player. //YOU NEED android.permission.RECORD_AUDIO for that in AndroidManifest.xml mVisualizer = new Visualizer(mp.getAudioSessionId()); mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]); mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener() { public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) { mVisualizerView.updateVisualizer(bytes); } public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {} }, Visualizer.getMaxCaptureRate() / 2, true, false); } @Override protected void onPause() { super.onPause(); if (isFinishing() && mp != null) { mVisualizer.release(); mEqualizer.release(); mp.release(); mp = null; } } /** * A simple class that draws waveform data received from a * {@link Visualizer.OnDataCaptureListener#onWaveFormDataCapture } */ class VisualizerView extends View { private byte[] mBytes; private float[] mPoints; private Rect mRect = new Rect(); private Paint mForePaint = new Paint(); public VisualizerView(Context context) { super(context); init(); } private void init() { mBytes = null; mForePaint.setStrokeWidth(1f); mForePaint.setAntiAlias(true); mForePaint.setColor(Color.rgb(0, 128, 255)); } public void updateVisualizer(byte[] bytes) { mBytes = bytes; invalidate(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mBytes == null) { return; } if (mPoints == null || mPoints.length < mBytes.length * 4) { mPoints = new float[mBytes.length * 4]; } mRect.set(0, 0, getWidth(), getHeight()); for (int i = 0; i < mBytes.length - 1; i++) { mPoints[i * 4] = mRect.width() * i / (mBytes.length - 1); mPoints[i * 4 + 1] = mRect.height() / 2 + ((byte) (mBytes[i] + 128)) * (mRect.height() / 2) / 128; mPoints[i * 4 + 2] = mRect.width() * (i + 1) / (mBytes.length - 1); mPoints[i * 4 + 3] = mRect.height() / 2 + ((byte) (mBytes[i + 1] + 128)) * (mRect.height() / 2) / 128; } canvas.drawLines(mPoints, mForePaint); } } 

}

Este es un ejemplo de funcionamiento completo de la visualización de onda de audio de reproductor de medios de android … Espero que te ayude con tu solución …

Jani L

Hay algunas cosas importantes para usar Visualizer.

  1. el api level mínimo de api level debe ser igual o mayor que 9.
  2. Visualizer engine , error: -1 significa que RECORD_AUDIO permission .
  3. Visualizer engine , error: -4 significa Operation failed due to bad parameter . valor. algo malo en la configuración del Visualizador, no se configura correctamente Visualizer.

Y también vea mi respuesta aquí .

Nota

Parámetros (audioSession) identificador de sesión de audio único del sistema. Si audioSession no es 0, el visualizer se conectará a MediaPlayer o AudioTrack en la misma sesión de audio. De lo contrario, el Visualizer se aplicará a la mezcla de salida.

Falta permiso de Internet

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

U cant hacer cualquier cambio de objeto de visulizer después de habilitarlo. Así que basta con intercambiar a las líneas como se muestra en el código de belove.

 public class MediaPlayerActivity extends Activity { Visualizer visual; int formattedVizData[]; byte rawWaveForm[]; int cont = 0xFF; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Start media player & visualizer. MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer = MediaPlayer.create(this, Uri.parse("http://vprbbc.streamguys.net:80/vprbbc24.mp3")); mediaPlayer.start(); // Create the Visualizer object and attach it to our media player. try { // this line is not actually causing Exception ,It is because u are // enabling the visulizer to capture data & and after that setting // the capture size of buffer. U can't make any changes after // enabling it. I tried this same code and it's working fine for me visual = new Visualizer(mediaPlayer.getAudioSessionId()); visual.setCaptureSize(Visualizer.getCaptureSizeRange()[1]); visual.setEnabled(true); } catch (Exception ex) { Log.e("Visual Ex", ex.getMessage()); } } } 

Refiera este enlace para ver el mejor ejemplo https://github.com/felixpalmer/android-visualizer

  • Android ViewFlipper no se mueve
  • ¿Por qué mi FFT ofrece una salida de visualizador diferente de Windows Media Player?
  • Android ViewFlipper volver a la primera vista
  • Listener para el widget ViewFlipper que mueve eventos
  • Cómo comprobar el valor anterior en android de viewflipper
  • Java.lang.RuntimeException: No se puede inicializar el motor Visualizer, error: -4
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.