Android播放音乐时跳动的屏谱demo

摘要:
Android实现播放音频时的跳动频谱,并实现可以调节的均衡器。

Android实现播放音频时的跳动频谱,并实现可以调节的均衡器。

Main.java

  1. packagecom.wjq.audiofx;
  2. importandroid.app.Activity;
  3. importandroid.media.AudioManager;
  4. importandroid.media.MediaPlayer;
  5. importandroid.media.audiofx.Equalizer;
  6. importandroid.media.audiofx.Visualizer;
  7. importandroid.os.Bundle;
  8. importandroid.util.Log;
  9. importandroid.view.Gravity;
  10. importandroid.view.ViewGroup;
  11. importandroid.widget.LinearLayout;
  12. importandroid.widget.SeekBar;
  13. importandroid.widget.TextView;
  14. publicclassMainextendsActivity{
  15. privatestaticfinalStringTAG="AudioFxDemo";
  16. privatestaticfinalfloatVISUALIZER_HEIGHT_DIP=50f;
  17. privateMediaPlayermMediaPlayer;
  18. privateVisualizermVisualizer;
  19. privateEqualizermEqualizer;//均横器
  20. privateLinearLayoutmLinearLayout;
  21. VisualizerViewmVisualizerView;
  22. privateTextViewmStatusTextView;
  23. @Override
  24. publicvoidonCreate(Bundleicicle){
  25. super.onCreate(icicle);
  26. setVolumeControlStream(AudioManager.STREAM_MUSIC);
  27. mStatusTextView=newTextView(this);
  28. mLinearLayout=newLinearLayout(this);
  29. mLinearLayout.setOrientation(LinearLayout.VERTICAL);
  30. mLinearLayout.addView(mStatusTextView);
  31. setContentView(mLinearLayout);
  32. //CreatetheMediaPlayer
  33. mMediaPlayer=MediaPlayer.create(this,R.raw.test_cbr);
  34. if(null==mMediaPlayer)
  35. return;
  36. Log.d(TAG,"MediaPlayeraudiosessionID:"+mMediaPlayer.getAudioSessionId());
  37. setupVisualizerFxAndUI();
  38. setupEqualizerFxAndUI();
  39. //Makesurethevisualizerisenabledonlywhenyouactuallywanttoreceivedata,and
  40. //whenitmakessensetoreceivedata.
  41. mVisualizer.setEnabled(true);
  42. //Whenthestreamends,wedon'tneedtocollectanymoredata.Wedon'tdothisin
  43. //setupVisualizerFxAndUIbecausewelikelywanttohavemore,non-Visualizerrelatedcode
  44. //inthiscallback.
  45. mMediaPlayer.setOnCompletionListener(newMediaPlayer.OnCompletionListener(){
  46. publicvoidonCompletion(MediaPlayermediaPlayer){
  47. mVisualizer.setEnabled(false);
  48. }
  49. });
  50. mMediaPlayer.start();
  51. mStatusTextView.setText("播放音频...");
  52. }
  53. /**
  54. *通过mMediaPlayer返回的AudioSessionId创建一个优先级为0均衡器对象,并且通过频谱生成相应的UI和对应的事件
  55. */
  56. privatevoidsetupEqualizerFxAndUI(){
  57. mEqualizer=newEqualizer(0,mMediaPlayer.getAudioSessionId());
  58. //启用均衡器
  59. mEqualizer.setEnabled(true);
  60. TextVieweqTextView=newTextView(this);
  61. eqTextView.setText("均横器:");
  62. mLinearLayout.addView(eqTextView);
  63. //通过均衡器得到其支持的频谱引擎
  64. shortbands=mEqualizer.getNumberOfBands();
  65. //getBandLevelRange是一个数组,返回一组频谱等级数组,返回一组频谱等级数组
  66. //第一个下标为最低的限度范围,第二个下标为最高的限度范围
  67. //依次取出
  68. finalshortminEQLevel=mEqualizer.getBandLevelRange()[0];
  69. finalshortmaxEQLevel=mEqualizer.getBandLevelRange()[1];
  70. for(shorti=0;i<bands;i++){
  71. finalshortband=i;
  72. TextViewfreqTextView=newTextView(this);
  73. freqTextView.setLayoutParams(newViewGroup.LayoutParams(
  74. ViewGroup.LayoutParams.FILL_PARENT,
  75. ViewGroup.LayoutParams.WRAP_CONTENT));
  76. freqTextView.setGravity(Gravity.CENTER_HORIZONTAL);
  77. freqTextView.setText((mEqualizer.getCenterFreq(band)/1000)+"Hz");
  78. mLinearLayout.addView(freqTextView);
  79. LinearLayoutrow=newLinearLayout(this);
  80. row.setOrientation(LinearLayout.HORIZONTAL);
  81. TextViewminDbTextView=newTextView(this);
  82. minDbTextView.setLayoutParams(newViewGroup.LayoutParams(
  83. ViewGroup.LayoutParams.WRAP_CONTENT,
  84. ViewGroup.LayoutParams.WRAP_CONTENT));
  85. minDbTextView.setText((minEQLevel/100)+"dB");
  86. TextViewmaxDbTextView=newTextView(this);
  87. maxDbTextView.setLayoutParams(newViewGroup.LayoutParams(
  88. ViewGroup.LayoutParams.WRAP_CONTENT,
  89. ViewGroup.LayoutParams.WRAP_CONTENT));
  90. maxDbTextView.setText((maxEQLevel/100)+"dB");
  91. LinearLayout.LayoutParamslayoutParams=newLinearLayout.LayoutParams(
  92. ViewGroup.LayoutParams.FILL_PARENT,
  93. ViewGroup.LayoutParams.WRAP_CONTENT);
  94. layoutParams.weight=1;
  95. SeekBarbar=newSeekBar(this);
  96. bar.setLayoutParams(layoutParams);
  97. bar.setMax(maxEQLevel-minEQLevel);
  98. bar.setProgress(mEqualizer.getBandLevel(band));
  99. bar.setOnSeekBarChangeListener(newSeekBar.OnSeekBarChangeListener(){
  100. publicvoidonStopTrackingTouch(SeekBarseekBar){}
  101. publicvoidonStartTrackingTouch(SeekBarseekBar){}
  102. publicvoidonProgressChanged(SeekBarseekBar,intprogress,
  103. booleanfromUser){
  104. mEqualizer.setBandLevel(band,(short)(progress+minEQLevel));
  105. }
  106. });
  107. row.addView(minDbTextView);
  108. row.addView(bar);
  109. row.addView(maxDbTextView);
  110. mLinearLayout.addView(row);
  111. }
  112. }
  113. /**
  114. *生成一个VisualizerView对象,使音频频谱的波段能够反映到VisualizerView上
  115. */
  116. privatevoidsetupVisualizerFxAndUI(){
  117. mVisualizerView=newVisualizerView(this);
  118. mVisualizerView.setLayoutParams(newViewGroup.LayoutParams(
  119. ViewGroup.LayoutParams.FILL_PARENT,
  120. (int)(VISUALIZER_HEIGHT_DIP*getResources().getDisplayMetrics().density)));
  121. mLinearLayout.addView(mVisualizerView);
  122. intsessId=mMediaPlayer.getAudioSessionId();
  123. mVisualizer=newVisualizer(sessId);
  124. //参数必须是2的位数
  125. mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
  126. //设置允许波形表示,并且捕获它
  127. mVisualizer.setDataCaptureListener(newVisualizer.OnDataCaptureListener(){
  128. publicvoidonWaveFormDataCapture(Visualizervisualizer,byte[]bytes,
  129. intsamplingRate){
  130. mVisualizerView.updateVisualizer(bytes);
  131. }
  132. publicvoidonFftDataCapture(Visualizervisualizer,byte[]bytes,intsamplingRate){}
  133. },Visualizer.getMaxCaptureRate()/2,true,false);
  134. }
  135. @Override
  136. protectedvoidonPause(){
  137. super.onPause();
  138. if(isFinishing()&&mMediaPlayer!=null){
  139. mVisualizer.release();
  140. mEqualizer.release();
  141. mMediaPlayer.release();
  142. mMediaPlayer=null;
  143. }
  144. }
  145. }

VisualizerView.java

  1. packagecom.wjq.audiofx;
  2. importandroid.content.Context;
  3. importandroid.graphics.Canvas;
  4. importandroid.graphics.Color;
  5. importandroid.graphics.Paint;
  6. importandroid.graphics.Rect;
  7. importandroid.view.View;
  8. publicclassVisualizerViewextendsView{
  9. privatebyte[]mBytes;
  10. privatefloat[]mPoints;
  11. //矩形区域
  12. privateRectmRect=newRect();
  13. //画笔
  14. privatePaintmForePaint=newPaint();
  15. //初始化画笔
  16. privatevoidinit(){
  17. mBytes=null;
  18. mForePaint.setStrokeWidth(1f);
  19. mForePaint.setAntiAlias(true);
  20. mForePaint.setColor(Color.GREEN);
  21. }
  22. publicVisualizerView(Contextcontext){
  23. super(context);
  24. init();
  25. }
  26. publicvoidupdateVisualizer(byte[]bytes){
  27. mBytes=bytes;
  28. invalidate();
  29. }
  30. @Override
  31. protectedvoidonDraw(Canvascanvas){
  32. super.onDraw(canvas);
  33. if(mBytes==null){
  34. return;
  35. }
  36. if(mPoints==null||mPoints.length<mBytes.length*4){
  37. mPoints=newfloat[mBytes.length*4];
  38. }
  39. mRect.set(0,0,getWidth(),getHeight());
  40. for(inti=0;i<mBytes.length-1;i++){
  41. mPoints[i*4]=mRect.width()*i/(mBytes.length-1);
  42. mPoints[i*4+1]=mRect.height()/2
  43. +((byte)(mBytes[i]+128))*(mRect.height()/2)/128;
  44. mPoints[i*4+2]=mRect.width()*(i+1)/(mBytes.length-1);
  45. mPoints[i*4+3]=mRect.height()/2
  46. +((byte)(mBytes[i+1]+128))*(mRect.height()/2)/128;
  47. }
  48. canvas.drawLines(mPoints,mForePaint);
  49. }
  50. }

免责声明:文章转载自《Android播放音乐时跳动的屏谱demo》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python 最短路径ios 清理缓存下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

echarts使用技巧(一)echarts的图表自适应resize问题、单选、缩放等

因此,当浏览器发生调整大小事件时,让它触发rechart调整大小事件来重新绘制画布。使用窗口。resize=myChart resize;通过将窗口的调整大小事件分配给回声调整大小事件,可以实现自适应。当然,这是单一图表的情况。如果有多个图表,它将无法工作。...

PCL点云分割(2)

点云的分割是我想做的机器人手臂捕捉的一个非常重要的部分,因此首先要了解,如果我使用点云库来处理我用kinect获得的点云数据,这个例程也是由我自己慢慢修改程序并结合官方API的解释来实现的。如果我直接更改源程序,由于数据类型、头文件和其他原因,其中的许多细节可能无法编译,我们将很难找出错误。首先,让我们看看我自己设定的场景。然后我使用Kinect获取数据并观...

如何更改SQL Server2008默认数据库的存储路径

1.在安装SQlServer时,修改路径:当然,也可以修改共享函数目录和实例根目录。但是,我不知道共享函数目录和实例根目录是什么。...

SQL SERVER 查看数据库执行过哪些语句(SQL历史语句记录)

SQLSERVER查看数据库已执行的语句(SQL历史语句记录)1.查看SQL执行效率和语句SelectTOP1000ST。textAS“SQL语句已执行”,QS。execution_CountAS'执行次数',QS。total_ elapsed_timeAS“耗时”,QS。total_logical_ReadsAS“逻辑读取次数”,QS。total_logi...

如何快速把ps序列图层建立帧动画?

工具ps1。将序列帧图片加载到ps新建-˃脚本-˃将文件加载到堆栈2中。创建序列帧动画窗口-˃时间线-˃时间线面板的右上菜单-˃从层3创建帧。移除多余的透明画布选择所有层-˃图像-˃剪辑-˃基于透明度4。将图层保存到图片文件-˃脚本-˃将图层保存为文件隐藏白色背景5。导出序列框架文件-˃自动-˃联系人表6存储为png...

Linux cat查看文件,查找关键字(grep),统计(wc -l)

######cat搜索关键字的语法:cat file | grep keyword | wc lcat/proc/meminfo | grepSwap | wc-l#######Linux系统中wc命令的功能是统计指定文件中的字节、单词和行数,并显示和输出统计结果。如果没有给出文件名,则从标准输入中读取。wc还提供指定文件的总统计数。此标志不能与-c标志一起...