我正在尝试实现Android Visualizer类。我已经查找了其他的问题线程,但我仍然得到一个致命的错误。在我看来,这一切看起来都应该正常工作,不管是什么原因,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());
}
}
}
发布于 2011-12-24 06:47:10
我也有同样的问题,所以尝试在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媒体播放器音波可视化的工作示例。我希望它能帮助你找到解决方案。
贾尼·L
发布于 2015-02-10 16:35:47
使用Visualizer有一些重要的事情。
错误最小值必须等于或大于9.
Visualizer engine
,错误:-1表示 is 9.Visualizer engine
,api level
:-4表示RECORD_AUDIO permission
为Operation failed due to bad parameter
。价值。展示台的配置有问题,你没有正确设置展示台。还可以看看我的answer here。
便笺
Parameters (audioSession)系统范围内唯一的音频会话标识符。如果audioSession
不为0,则visualizer
将在同一音频会话中连接到MediaPlayer或AudioTrack。否则,Visualizer
将应用于输出混合。
发布于 2019-09-06 18:29:55
@Kaushal28,@ihsan,gaozp,@Big Money
错误代码表示-3 \f25 ERROR_NO_INIT -3\f6注:-3\f25 https://developer.android.com/reference/kotlin/android/media/audiofx/Visualizer -3\f6
我也有过同样的经历,并使用了录音机的audioSesstionId。
如果你查看Visualizer的文档,你只能使用MediaPlayer和AudioTrack,如下所示。
If audioSession is not 0, the visualizer will be attached to the
MediaPlayer or AudioTrack in the same audio session. Otherwise,
the Visualizer will apply to the output mix.
https://stackoverflow.com/questions/8595692
复制相似问题