我的世界js吧 关注:27,786贴子:251,317
  • 3回复贴,共1

[算法分享]AudioFx Visualizer音频可视化

只看楼主收藏回复

声明:未经允许禁止转载
---------------------------
此算法采用Fft音频技术(Android自带)
类方法:android.media.audiofx.Visualizer
调用方法:
var Vis = new AudioFxVisualizer(new android.media.MediaPlayer(),CanvasWidth,CanvasHeight);
//如果不设置为true将不会采集声波(默认false)
Vis.setEnabled(true);
Vis.drawLineGraphics(new android.graphics.Canvas());
例子(宽度和高度请设置相同值):
//播放音乐
var media = new android.media.MediaPlayer();
media.reset();
media.setDataSource(new java.io.File("storage/sdcard0/Works/雪解 (おてんば恋娘).mp3"));
media.prepare();
media.start();
//音频可视化(需要由ImageView承载)
var canvas = new android.graphics.Canvas();
var bitmap = android.graphics.Bitmap.createBitmap(宽度, 高度, android.graphics.Bitmap.Config.ARGB_8888);
canvas.setBitmap(bmp);
var image = new android.widget.ImageView(ctx);
image.setImageBitmap(bmp);
image.setLayoutParams(new android.widget.LinearLayout.LayoutParams(宽度, 高度));
var visualizer = new AudioFxVisualizer(media, 宽度, 高度);
visualizer.setEnabled(true);
visualizer.drawLineGraphics(canvas);
注:drawLineGraphics方法不是实时刷新,想做到实时自己想办法
drawWaveGraphics方法暂时废弃
下次更新drawWaveGraphics方法和调音器
算法原创,可以修改自用,严禁修改后二次转载发布
作者:Tracer追踪者丶
觉得有用就关注一下呗
2L算法
另外附上效果图
禁止发广告


IP属地:上海来自手机贴吧1楼2017-02-04 12:23回复
    Tracer追踪者是炸吗盒子id


    IP属地:上海来自手机贴吧2楼2017-02-04 12:26
    回复
      function AudioFxVisualizer(MediaPlayer, RectW, RectH) {
      try {
      _MediaPlayer = android.media.MediaPlayer;
      _Visualizer = android.media.audiofx.Visualizer;
      _Canvas = android.graphics.Canvas;
      _Color = android.graphics.Color;
      _Paint = android.graphics.Paint;
      _Rect = android.graphics.Rect;
      var VISUALIZER = new _Visualizer(MediaPlayer.getAudioSessionId());
      var PAINT = new _Paint();
      var RECT = new _Rect();
      var POINTS = Array();
      var BYTES = Array();
      VISUALIZER.setCaptureSize(_Visualizer.getCaptureSizeRange()[1]);
      VISUALIZER.setDataCaptureListener(new _Visualizer.OnDataCaptureListener() {
      onWaveFormDataCapture: function(_Visualizer, waveform, samplingRate) {
      BYTES = waveform;
      },
      onFftDataCapture: function(_Visualizer, fft, samplingRate) {
      BYTES = fft;
      }
      }, _Visualizer.getMaxCaptureRate() / 2, true, false);
      this.setEnabled = function(boolean) {
      VISUALIZER.setEnabled(boolean);
      }
      PAINT.setStrokeWidth(3);
      PAINT.setAntiAlias(true);
      PAINT.setColor(_Color.argb(170, 0, 128, 255));
      RECT.set(0, 0, RectW, RectH);
      this.drawLineGraphics = function(Canvas) {
      Canvas.drawColor(android.graphics.Color.TRANSPARENT, android.graphics.PorterDuff.Mode.CLEAR);
      for (var i = 0; i < BYTES.length - 1; i += 20) {
      var left = RECT.width() * i / (BYTES.length - 1);
      var top = (6 * RECT.height() / 8) - (-Math.abs(BYTES[i + 1]) + 256) * (RECT.height() / 2) / 256;
      var right = left + 6;
      var bottom = RECT.height() / 2;
      Canvas.drawRect(left, top, right, bottom, PAINT);
      }
      }
      this.drawWaveGraphics = function(Canvas) {
      if (POINTS == null || POINTS.length < BYTES.length * 4) {
      POINTS = new Array(BYTES.length * 4);
      for (var i = 0; i < BYTES.length - 1; i++) {
      POINTS[i * 4] = RECT.width() * i / (BYTES.length - 1);
      POINTS[i * 4 + 1] = RECT.height() / 2 + (BYTES[i] + 128) * (RECT.height() / 2) / 128;
      POINTS[i * 4 + 2] = RECT.width() * (i + 1) / (BYTES.length - 1);
      POINTS[i * 4 + 3] = RECT.height() / 2 + (BYTES[i + 1] + 128) * (RECT.height() / 2) / 128;
      }
      Canvas.drawColor(_Color.TRANSPARENT, android.graphics.PorterDuff.Mode.CLEAR);
      Canvas.drawLines(POINTS, PAINT);
      print("ok");
      }
      }
      } catch (Error) {
      ErrorDialog(Error);
      }
      }


      IP属地:上海来自手机贴吧3楼2017-02-04 12:26
      回复
        挺厉害的


        IP属地:广东来自Android客户端50楼2017-02-05 16:58
        回复