Сбой внедрения Visualizer для Android

Я пытаюсь реализовать класс Visualizer для Android. Я искал другие проблемы, но я все еще получаю фатальную ошибку. Это все выглядит так, как будто он должен работать правильно, по какой-то причине AVD продолжает рушиться.

Во-первых, я использую разрешения:

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

Вот мой 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. 

И мой код:

 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()); } } } 

    У меня такая же проблема, поэтому попробуйте добавить разрешение в файл AndroidManifest.xml

    Также, если вы не увидите эту аудио-волну, вы можете показать ее на холсте или что-то в этом роде …

    Рабочий пример:

     //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); } } 

    }

    Это полный рабочий пример визуализации звуковых волн в медиа-плеерах Android. Надеюсь, это поможет вам в решении …

    Jani L

    Есть несколько важных вещей для использования Visualizer.

    1. Минимальный api level должен быть равен или больше 9.
    2. RECORD_AUDIO permission Visualizer engine , ошибка: -1 означает, RECORD_AUDIO permission отсутствует.
    3. Visualizer engine , ошибка: -4 означает, что Operation failed due to bad parameter . стоимость. Что-то плохое в конфигурации Visualizer, вы неправильно настроили Visualizer.

    А также см. Мой ответ здесь .

    Заметка

    Уникальный идентификатор аудиосигнала системы (audioSession). Если audioSession не равно 0, visualizer будет прикреплен к MediaPlayer или AudioTrack в том же сеансе аудио. В противном случае Visualizer будет применяться к выходному микшированию.

    У вас нет доступа к Интернету

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

    Не допускайте внесения каких-либо изменений в объект visulizer после включения. Поэтому просто переходите к строкам, как показано в коде 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()); } } } 

    Перейдите по этой ссылке для лучшего примера https://github.com/felixpalmer/android-visualizer