2011-12-21 58 views
3

我想实现Android Visualizer类。我查了其他麻烦线程,但我仍然得到一个致命的错误。这一切都让我觉得它应该正常工作,无论出于何种原因,AVD都会崩溃。Android Visualizer实施崩溃

首先,我使用的权限:

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

你解决了这个问题吗?我遇到了同样的问题,包括我自己的代码和SDK的ApiDemos中的示例。我已经在我的2.3手机和4.0.3模拟器上试过了。 – Tom 2012-01-17 18:38:35

回答

10

我有同样的问题,所以尝试在AndroidManifest.xml文件中添加 权限

此外,如果你wan`t看到奥迪波,你HOULD显示它在画布或东西...

工作例如:

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

}

这是一个安卓媒体播放器音频波形可视化的完整实例...我希望它能帮助您解决您的问题...

贾尼大号

+0

谢谢,但我已经将这些权限添加到XML文件。尽管我并不需要展示它,但我只是使用该类来从正在播放的音乐中获取一些原始数据。我很欣赏这种努力。 – YoungGuy 2011-12-24 18:25:21

+0

@janilemy你能帮助我吗?我想用波形播放音频。我阅读可视化类的信息,我按照你的代码实现,但我得到像“可视化类不是”的日志猫错误。 – 2012-12-01 11:17:14

+0

@janilemy你能帮我吗..我想添加图像和按钮以及可视化器,所以我该怎么做?通过编码..我试图如此膨胀,但我失败的初始..请帮助我 – 2013-01-15 13:01:24

0

你缺少Internet权限

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

ü不能启用它后作出visulizer对象的任何变化。所以只需要按照爱心代码所示的方式进行交换。

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

3

有使用可视化一些重要的事情。

  1. 最小api level必须等于或大于9
  2. Visualizer engine,误差越大:-1表示RECORD_AUDIO permission是 丢失。
  3. Visualizer engine,error:-4表示Operation failed due to bad parameter。值。在展示台配置中有些不好的地方,你不能正确地设置展示台。

并且还请参阅我的answer here

注意

参数(audioSession)系统范围内唯一的音频会话标识符。如果audioSession不是0,则visualizer将在同一音频会话中附加到MediaPlayer或AudioTrack。否则,Visualizer将适用于输出组合。

+0

如果错误代码是-3?即时获得-3。 – Kaushal28 2017-02-17 12:36:52

+0

最新评论,但:我发现添加权限后可能需要重新启动。看看我的答案http://stackoverflow.com/questions/6971567/android-visualizer-class-throwing-runtime-exception/42704999#42704999 – Fruchtzwerg 2017-03-09 20:44:16

+0

@ Kaushal28你好,我也遇到了-3错误代码,这是什么代码的意思?你有没有解决过这个错误? plz给我一些sugession – 2017-09-01 02:04:32

0

做完所有后,如果可视化不开始然后尝试visualizationview.startRendering()