java音频频谱,android获取和展示音乐的频谱

https://blog.csdn.net/aiynmimi/article/details/53189076 (Android音频进阶 Equalizer,Visualizer,BassBoost,PresetReverb,EnvironmentalReverb)

https://www.cnblogs.com/sage-blog/p/3885802.html (JNI实例1---扫描SD卡中mp3文件 JNI实例2---扫描SD卡中mp3文件,native层调用Java自定义的类 JNI实例3---扫描SD卡中mp3文件,native层调用Java自定义的类)

做了个音乐播放器 就一直想做个加一个音乐频谱的展示界面

觉的这是一个好玩的东西,可以将耳边动听的声音形象化,仿佛眼前可以看到声音一样。

但是我在文档的开发者指南里没有讲任何有关音乐频谱的东西,最后还是在google的源码示例中找到了。

你可以直接去参看源代码更原滋原味 以下只是个人对着源码的重构和理解

所有以下所讲的功能,均需要在2.3以上的sdk中才能实现。

音频频谱的获取

首先音频的频谱相关的类叫做 android.media.audiofx.Visualizer;

需要权限 所以要做的第一件事 是初始化一个visualizer出来

//使用音乐的sessionId来实例化这个类

mVisualizer = new Visualizer(mMediaPlayer.getAudioSessionId());

//设置每次捕获频谱的大小,音乐在播放中的时候采集的数据的大小或者说是采集的精度吧,我的理解,而且getCaptureSizeRange()所返回的数组里面就两个值 .文档里说数组[0]是最小值(128),数组[1]是

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用Java编写的Android音频频谱展示示例代码: 首先,在XML布局中添加一个SurfaceView来显示频谱: ```xml <SurfaceView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 然后,在Activity中初始化SurfaceView和MediaPlayer,设置MediaPlayer的数据源和监听器,以便在播放音频时更新频谱: ```java public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener { private SurfaceView surfaceView; private SurfaceHolder surfaceHolder; private MediaPlayer mediaPlayer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); surfaceView = findViewById(R.id.surface_view); surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(this); mediaPlayer = new MediaPlayer(); mediaPlayer.setOnPreparedListener(this); mediaPlayer.setOnCompletionListener(this); try { AssetFileDescriptor afd = getAssets().openFd("music.mp3"); mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } } @Override public void onPrepared(MediaPlayer mp) { mediaPlayer.start(); } @Override public void onCompletion(MediaPlayer mp) { mediaPlayer.seekTo(0); mediaPlayer.start(); } // ... } ``` 接下来,在SurfaceHolder.Callback的回调方法中初始化画笔和音频波形数据,并在每次SurfaceView绘制时更新频谱: ```java public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener { // ... private Paint paint; private float[] waveform; @Override public void surfaceCreated(SurfaceHolder holder) { paint = new Paint(); paint.setColor(Color.WHITE); waveform = new float[mediaPlayer.getDuration() / 100]; new Thread(() -> { while (true) { if (mediaPlayer.isPlaying()) { int currentPosition = mediaPlayer.getCurrentPosition(); int amplitude = mediaPlayer.getAmplitude(); waveform[currentPosition / 100] = amplitude; } } }).start(); new Thread(() -> { while (true) { Canvas canvas = surfaceHolder.lockCanvas(); if (canvas != null) { canvas.drawColor(Color.BLACK); for (int i = 0; i < waveform.length; i++) { float x = i * 10; float y = waveform[i] / 100; canvas.drawLine(x, surfaceView.getHeight(), x, surfaceView.getHeight() - y, paint); } surfaceHolder.unlockCanvasAndPost(canvas); } } }).start(); } // ... } ``` 最后,在Activity销毁时释放MediaPlayer资源: ```java @Override protected void onDestroy() { super.onDestroy(); if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值