2012-06-18 7 views
2

저는 Android 프로그래밍 및 오디오 시각화를 처음 사용합니다. MediaPlayerVisualizer 클래스를 사용하여 간단한 오디오 비주얼 라이저를 만들고 싶습니다. 내 문제는, 뭔지 모르겠다 wave form data 정말입니다. 오디오를 시각화하기 위해 사용해야합니까? 아래 코드를 사용하고 있습니다. 문제는 파일의 처음 10-12 초 동안 오디오 만 시각화한다는 것입니다. 그 후에 더 많은 데이터를 캡처 할 수 없습니다. 나는 어디로 잘못 갔는가?Visualizer 객체의 onWaveFormDataCapture 결과를 처리하는 방법은 무엇입니까?

public void attachVisualizer() 
{ 
    Visualizer vis = new Visualizer(mPlayer.getAudioSessionId()); 

    vis.setCaptureSize(Visualizer.getCaptureSizeRange()[0]); 
    vis.setDataCaptureListener(new Visualizer.OnDataCaptureListener() { 
     public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) { 
      int sum = 0; 

      for(int i = 0; i < bytes.length; i++) { 
       sum += bytes[i]; 
      } 

      if(sum > 8000) { 
       // Do something which uses mPlayer.getCurrentPosition() in mathematics 
      } 
     } 

     public void onFftDataCapture(Visualizer visualizer, byte[] fft, int samplingRate) {} 
    }, Visualizer.getMaxCaptureRate() , true, false); 

    vis.setEnabled(true); 
} 

편집
그리고 내 마음에 또 다른 질문은, 어떻게 주어진 오디오 세그먼트에 포함 된 시간의 길이를 기록 할입니까?

답변

3

내가 다음을 수행하십시오 비주얼보기위한

visualizer = new Visualizer(0); 
    visualizer.setEnabled(false); 

    visualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[0]); 
    visualizer.setDataCaptureListener(
      new Visualizer.OnDataCaptureListener() { 

       public void onWaveFormDataCapture(Visualizer visualizer, 
         byte[] bytes, int samplingRate) { 
        eqview.setVSWaveForm(bytes); 
       } 

       public void onFftDataCapture(Visualizer visualizer, 
         byte[] bytes, int samplingRate) { 
        fftview.setVSFftData(bytes); 
       } 
      }, Visualizer.getMaxCaptureRate(), true, true); 
    visualizer.setEnabled(true); 

, 나는 온라인이 코드를 발견, 나는 그것을 기록하지 않았다 절반 높이

package app.util; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Rect; 
import android.util.AttributeSet; 
import android.view.View; 

/*** 
* 
* 
* @author yokmama 
* 
*/ 
public class VisualizerView extends View { 

private byte[] mBytes; 

private float[] mPoints; 

private Rect mRect = new Rect(); 
//SharedPreferences prefs; 
private Paint mForePaint = new Paint(); 

public VisualizerView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    //prefs = PreferenceManager.getDefaultSharedPreferences(context); 
    init(); 
} 

private void init() { 
    mBytes = null; 
    //int colorchosen = prefs.getInt("COLOR_PREFERENCE_KEY", 
    //  Color.WHITE); 
    mForePaint.setStrokeWidth(1); 
    //mForePaint.setAntiAlias(true); 
    mForePaint.setColor(Color.WHITE); 
    //mForePaint.setMaskFilter(new BlurMaskFilter(1, Blur.INNER)); 

} 

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); 
    //canvas.drawPoints(mPoints, mForePaint); 
} 

}

+0

의 전시를. 나는 서비스에서 바이트를 설정하고있다. –