2012-07-06 5 views
6

3 일 전에 Android 용 프로그램을 시작했습니다. 오늘은 안드로이드 API의 일부 클래스를 사용하여 더 어려운 작업을하고 싶습니다. Visualizer 클래스를 찾았고 처음에는 문제가 발생했습니다. 동일한 문제가있는 다른 포럼 사람들에게 많은 게시물을 읽었습니다 : 시각화 엔진을 초기화 할 수 없습니다. Android : "비주얼 라이저 엔진을 초기화 할 수 없습니다"

나는 requierd 사용-권한을 Manifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="org.program.fourier" 
    android:versionCode="1" 
    android:versionName="1.0" > 

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

    <uses-sdk 
     android:minSdkVersion="10" 
     android:targetSdkVersion="15" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 

     <activity 
      android:name=".mainFFT" 
      android:label="@string/title_activity_main_fft" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

다음에 내가이 문제를 해결하려했지만 그럴 수 없어했다. 이 내 전체 코드입니다 :

package org.program.fourier; 

import android.os.Bundle; 
import android.app.Activity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.support.v4.app.NavUtils; 

import android.media.audiofx.Visualizer; 
import android.media.audiofx.Visualizer.OnDataCaptureListener; 
import android.media.MediaPlayer; 
import android.media.AudioManager; 

public class mainFFT extends Activity { 

    MediaPlayer mPlayer; 
    Visualizer vis; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_fft); 

     mPlayer = MediaPlayer.create(this, R.raw.sight); 
     mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

     try 
     { 
      mPlayer.prepare(); 
     } 
     catch(Exception ex){ Log.w("ExCePtIoN", ex+""); } 

     try 
     { 
      vis = new Visualizer(mPlayer.getAudioSessionId()); 
     //vis.setDataCaptureListener(this, 20, true, true); 
     } 
     catch(Exception ex){ Log.w("ExCePtIoN", ex+""); } 


     mPlayer.start(); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main_fft, menu); 
     return true; 
    } 


} 

그리고 마지막 문제는 내가 mPlayer.prepare() 메소드를 실행 할 때 IllegalStateException을 발생한다는 것입니다.

이 전체 로그 캣 메시지 :

07-06 18:33:17.141: E/Trace(833): error opening trace file: No such file or directory (2) 
07-06 18:33:17.591: E/MediaPlayer(833): prepareAsync called in state 8 
07-06 18:33:17.591: W/ExCePtIoN(833): java.lang.IllegalStateException 
07-06 18:33:17.621: E/AudioEffect(833): set(): AudioFlinger could not create effect, status: -22 
07-06 18:33:17.621: E/visualizers-JNI(833): Visualizer initCheck failed -4 
07-06 18:33:17.621: E/Visualizer-JAVA(833): Error code -4 when initializing Visualizer. 
07-06 18:33:17.621: W/ExCePtIoN(833): java.lang.RuntimeException: Cannot initialize Visualizer engine, error: -4 
07-06 18:33:18.482: I/Choreographer(833): Skipped 337 frames! The application may be doing too much work on its main thread. 
07-06 18:33:18.551: D/gralloc_goldfish(833): Emulator without GPU emulation detected. 

답변

0

당신은 당신이 mPlayer.prepare()를 호출하기 전에 mPlayer.setDataSource()를 호출해야합니다. Github

public void link(MediaPlayer player) 
    { 
    if(player == null) 
    { 
     throw new NullPointerException("Cannot link to null MediaPlayer"); 
    } 

    // Create the Visualizer object and attach it to our media player. 
    mVisualizer = new Visualizer(player.getAudioSessionId()); 
    mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]); 

    // Pass through Visualizer data to VisualizerView 
    Visualizer.OnDataCaptureListener captureListener = new Visualizer.OnDataCaptureListener() 
    { 
     @Override 
     public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, 
      int samplingRate) 
     { 
     updateVisualizer(bytes); 
     } 

     @Override 
     public void onFftDataCapture(Visualizer visualizer, byte[] bytes, 
      int samplingRate) 
     { 
     updateVisualizerFFT(bytes); 
     } 
    }; 

    mVisualizer.setDataCaptureListener(captureListener, 
     Visualizer.getMaxCaptureRate()/2, true, true); 

    // Enabled Visualizer and disable when we're done with the stream 
    mVisualizer.setEnabled(true); 
    player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() 
    { 
     @Override 
     public void onCompletion(MediaPlayer mediaPlayer) 
     { 
     mVisualizer.setEnabled(false); 
     } 
    }); 
    } 

에서 http://developer.android.com/reference/android/media/MediaPlayer.html

1

근무 예와 안드로이드 개발자 사이트에 AudioFxDemo을 확인하십시오
당신은에서 상태를 변경하기위한 모든 지침을 찾을 수 있습니다.

+0

은 http://stackoverflow.com/a/28427213/3496570을 참조해야합니다. – Nepster