2011-12-21 61 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()