Android Visualizer 实现崩溃

2024-04-10

我正在尝试实现 Android Visualizer 类。我已经查找了其他问题线程,但仍然遇到致命错误。在我看来,这一切都应该正常工作,无论出于何种原因 AVD 不断崩溃。

首先,我正在使用权限:

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

这是我的日志猫:

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

我有同样的问题,所以尝试添加 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 媒体播放器音频波可视化的完整工作示例...我希望它能帮助您解决问题...

Jani L

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Visualizer 实现崩溃 的相关文章

随机推荐

  • React Native + React Native Paper 应用程序中未显示图标

    这是一个新鲜的React Native应用程序使用React Native Paper 我按照以下说明进行操作https callstack github io react native paper getting started html
  • 无法实现 grunt-connect-proxy

    为了 http 127 0 0 1 9000 我得到的路线 不能获取 对于 v1 路线我得到 未找到 在此服务器上找不到请求的 URL v1 这是我的 Gruntfile js Generated on 2013 10 08 using g
  • 计算小于当前值的值的数量

    我想计算列中的行数input如果值小于当前行 请参阅下面想要的结果 对我来说 问题是条件基于当前行值 因此它与条件是固定数字的一般情况有很大不同 data lt data frame input c 1 1 1 1 2 2 3 5 5 5
  • 绑定这个更好还是使用变量更好? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • C# 无法从传输连接读取数据:现有连接被远程主机强制关闭。读取网络流

    我看过 无法从传输连接读取数据连接已关闭 https stackoverflow com questions 26995191 unable to read data from the transport connection the co
  • JavaFX 场景的显示随机延迟

    我创建了一个 JavaFX 应用程序 在 Ubuntu Java SE 运行时环境 版本 1 8 0 131 b11 上运行 并制作了一个简单的测试应用程序 public class DelayedSceneApplication exte
  • Angular 2 模拟响应不起作用

    我有以下 Angular 2 测试 tslint disable no unused variable import provide from angular core import MockBackend from angular htt
  • Pyinstaller 无法执行脚本 pyi_rth_pkgres

    I converted the py script to exe using pyinstaller but when I try to run the exe I got this How can I fix it 您必须告诉 pyins
  • 从文件express js 提供 json

    新手要表达的是 我有一个包含 db json 文件的文件夹 并且每 11 秒就会被新的 db json 替换 让express js 提供服务以便在 api 调用上显示新内容的最佳方法是什么 这是我到目前为止所拥有的 const expre
  • 具有多重身份的B2C用户

    在 Azure B2C 中 有多个身份提供商 在本示例中 我将使用本地帐户和 Google 帐户 新用户使用电子邮件地址注册本地帐户 电子邮件受保护 cdn cgi l email protection 他们使用该网站 下次返回时 他们决定
  • Lucene 中跨多个字段的重复值的影响

    在 lucene 索引中的多个字段中重新索引相同的值会产生什么影响 这个想法是 某人的名字是他们的名字和一般详细信息的一部分 所以我想将该值索引到多个字段中 Ted Bloggs 我可能会索引如下 Field Value firstName
  • 删除 SQLPLUS 中不需要的/额外的数据

    我正在通过批处理文件运行一个文件 批处理文件 sqlplus admin admin SERVER abc sql gt output txt SQL 文件 abc sql set PAGESIZE 1000 set LINESIZE 55
  • Symfony POST 变量始终为空

    这是我的 Symfony 控制器 class MyPageController extends Controller public function indexAction Request request postData request
  • 如何使用“setInterval()”每秒更新时间而不使时间每秒闪烁?

    我正在使用一个下拉列表 该列表使用时刻时区显示不同的时区 例如 当您单击标有 est 的下拉列表时 它将显示东部时间的时间 当您单击 cst 时 将显示 cst 时间 依此类推 无论如何 我遇到的问题是 我使用setInterval upd
  • Magento:设置集合限制

    我试图找出的问题是如何对集合设置限制 我在 Google 上找到的答案仅适用于具有 setPage pageNum pageSize 的目录 这对任何其他集合都不起作用 请参阅下面的答案 做这件事有很多种方法 collection Mage
  • 记录执行的java代码的行数

    我正在编写 PHP Web 应用程序的一部分 将在高中错误查找竞赛中使用 用户必须在给定的 Java 程序中查找错误 作为其中的一部分 当 Java 程序执行时 我们希望突出显示已执行代码的 Java 程序源代码行 为此 我们需要的是已执行
  • Google Cloud 上的一个项目下是否可以拥有多个聊天机器人

    最近 我用 DialogFlow 构建聊天机器人的项目空间用完了 我不认为我在 Google Cloud 上的项目中使用了最佳标准 任何提示都很棒 而且由于我尝试创建一个新的聊天机器人 它会告诉我项目空间不足 是否可以将这些聊天机器人放在同
  • 如何从匹配的几何效果中删除/控制淡入淡出效果?

    我有一个测试代码来显示这个问题 当我使用matchedGeometryEffect时 matchedGeometryEffect向渲染结果添加了不希望的淡入淡出效果 所以我喜欢删除这种淡入淡出效果甚至控制它 当我将视图颜色从一种颜色更改为另
  • 需要一些帮助来理解注解 - Spring 注解

    我正在尝试学习 Spring 和 Hibernate 并且我真的很难理解注释及其工作原理 我在互联网上看到的大多数示例都是基于注释的示例 因此我需要先了解注释如何工作 然后才能学习 Spring 或 Hibernate 我知道它们是什么以及
  • Android Visualizer 实现崩溃

    我正在尝试实现 Android Visualizer 类 我已经查找了其他问题线程 但仍然遇到致命错误 在我看来 这一切都应该正常工作 无论出于何种原因 AVD 不断崩溃 首先 我正在使用权限