阳光网驿-企业信息化交流平台【DTC零售连锁全渠道解决方案】

 找回密码
 注册

QQ登录

只需一步,快速开始

扫描二维码登录本站

手机号码,快捷登录

老司机
查看: 2872|回复: 5

[转帖] android的频谱代码

[复制链接]
  • TA的每日心情
    开心
    2012-3-7 10:15
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2012-2-1 11:46:55 | 显示全部楼层 |阅读模式
    [代码] [Java]代码
    public class AudioFxActivity extends Activity
    {
    private static final String TAG = "AudioFxActivity";
    private static final float VISUALIZER_HEIGHT_DIP = 50f;
    private MediaPlayer mMediaPlayer;
    private Visualizer mVisualizer;
    private Equalizer mEqualizer; // 均衡器
    private LinearLayout mLayout;
    VisualizerView mVisualizerView;
    private TextView mStatusTextView;
    public void onCreate(Bundle savedInstanceState)
    {
      super.onCreate(savedInstanceState);
      setVolumeControlStream(AudioManager.STREAM_MUSIC);
      mStatusTextView = new TextView(this);
      mLayout = new LinearLayout(this);
      mLayout.setOrientation(LinearLayout.VERTICAL);
      mLayout.addView(mStatusTextView);
      setContentView(mLayout);
      mMediaPlayer = MediaPlayer.create(this, R.raw.z8806c);
      setupVisualizerFxAndUi();
      setupEqualizeFxAndUi();
      mVisualizer.setEnabled(true);
      mMediaPlayer.setOnCompletionListener(new OnCompletionListener()
      {
       @Override
       public void onCompletion(MediaPlayer mp)
       {
        // TODO Auto-generated method stub
        mVisualizer.setEnabled(false);
       }
      });
      mMediaPlayer.start();
      mStatusTextView.setText("播放中。。。");
    }
    /**
      * 通过mMediaPlayer返回的AudioSessionId创建一个优先级为0均衡器对象 并且通过频谱生成相应的UI和对应的事件
      */
    private void setupEqualizeFxAndUi()
    {
      mEqualizer = new Equalizer(0, mMediaPlayer.getAudioSessionId());
      mEqualizer.setEnabled(true);// 启用均衡器
      TextView eqTextView = new TextView(this);
      eqTextView.setText("均衡器:");
      mLayout.addView(eqTextView);
      // 通过均衡器得到其支持的频谱引擎
      short bands = mEqualizer.getNumberOfBands();
      // getBandLevelRange 是一个数组,返回一组频谱等级数组,
      // 第一个下标为最低的限度范围
      // 第二个下标为最大的上限,依次取出
      final short minEqualizer = mEqualizer.getBandLevelRange()[0];
      final short maxEqualizer = mEqualizer.getBandLevelRange()[1];
      for (short i = 0; i < bands; i++)
      {
       final short band = i;
       TextView freqTextView = new TextView(this);
       freqTextView.setLayoutParams(new ViewGroup.LayoutParams(
         ViewGroup.LayoutParams.FILL_PARENT,
         ViewGroup.LayoutParams.WRAP_CONTENT));
       freqTextView.setGravity(Gravity.CENTER_HORIZONTAL);
       // 取出中心频率
       freqTextView
         .setText((mEqualizer.getCenterFreq(band) / 1000) + "HZ");
       mLayout.addView(freqTextView);
       LinearLayout row = new LinearLayout(this);
       row.setOrientation(LinearLayout.HORIZONTAL);
       TextView minDbTextView = new TextView(this);
       minDbTextView.setLayoutParams(new ViewGroup.LayoutParams(
         ViewGroup.LayoutParams.WRAP_CONTENT,
         ViewGroup.LayoutParams.WRAP_CONTENT));
       minDbTextView.setText((minEqualizer / 100) + " dB");
       TextView maxDbTextView = new TextView(this);
       maxDbTextView.setLayoutParams(new ViewGroup.LayoutParams(
         ViewGroup.LayoutParams.WRAP_CONTENT,
         ViewGroup.LayoutParams.WRAP_CONTENT));
       maxDbTextView.setText((maxEqualizer / 100) + " dB");
       LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
         ViewGroup.LayoutParams.FILL_PARENT,
         ViewGroup.LayoutParams.WRAP_CONTENT);
       layoutParams.weight = 1;
       SeekBar seekbar = new SeekBar(this);
       seekbar.setLayoutParams(layoutParams);
       seekbar.setMax(maxEqualizer - minEqualizer);
       seekbar.setProgress(mEqualizer.getBandLevel(band));
       seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
       {
        @Override
        public void onStopTrackingTouch(SeekBar seekBar)
        {
        }
        @Override
        public void onStartTrackingTouch(SeekBar seekBar)
        {
        }
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
          boolean fromUser)
        {
         // TODO Auto-generated method stub
         mEqualizer.setBandLevel(band,
           (short) (progress + minEqualizer));
        }
       });
       row.addView(minDbTextView);
       row.addView(seekbar);
       row.addView(maxDbTextView);
       mLayout.addView(row);
      }
    }
    /**
      * 生成一个VisualizerView对象,使音频频谱的波段能够反映到 VisualizerView上
      */
    private void setupVisualizerFxAndUi()
    {
      mVisualizerView = new VisualizerView(this);
      mVisualizerView.setLayoutParams(new ViewGroup.LayoutParams(
        ViewGroup.LayoutParams.FILL_PARENT,
        (int) (VISUALIZER_HEIGHT_DIP * getResources()
          .getDisplayMetrics().density)));
      mLayout.addView(mVisualizerView);
      mVisualizer = new Visualizer(mMediaPlayer.getAudioSessionId());
      // 参数内必须是2的位数
      mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
      // 设置允许波形表示,并且捕获它
      mVisualizer.setDataCaptureListener(new OnDataCaptureListener()
      {
       @Override
       public void onWaveFormDataCapture(Visualizer visualizer,
         byte[] waveform, int samplingRate)
       {
        // TODO Auto-generated method stub
        mVisualizerView.updateVisualizer(waveform);
       }
       @Override
       public void onFftDataCapture(Visualizer visualizer, byte[] fft,
         int samplingRate)
       {
        // TODO Auto-generated method stub
       }
      }, Visualizer.getMaxCaptureRate() / 2, true, false);
    }
    @Override
    protected void onPause()
    {
      // TODO Auto-generated method stub
      super.onPause();
      if (isFinishing() && mMediaPlayer != null)
      {
       mVisualizer.release();
       mMediaPlayer.release();
       mEqualizer.release();
       mMediaPlayer = null;
      }
    }
    class VisualizerView extends View
    {
      private byte[] mBytes;
      private float[] mPoints;
      // 矩形区域
      private Rect mRect = new Rect();
      // 画笔
      private Paint mPaint = new Paint();
      // 初始化画笔
      private void init()
      {
       mBytes = null;
       mPaint.setStrokeWidth(1f);
       mPaint.setAntiAlias(true);
       mPaint.setColor(Color.BLUE);
      }
      public VisualizerView(Context context)
      {
       super(context);
       init();
      }
      public void updateVisualizer(byte[] mbyte)
      {
       mBytes = mbyte;
       invalidate();
      }
      @Override
      protected void onDraw(Canvas canvas)
      {
       // TODO Auto-generated method stub
       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 + 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, mPaint);
      }
    }
    }
    楼主热帖
    启用邀请码注册,提高发帖质量,建设交流社区

    该用户从未签到

    发表于 2012-2-1 11:48:22 | 显示全部楼层
    成功的路上,吉利的路上,人总是越聚越多,失帐的路上,祸患的上到底也有人走,虽然不是愿意的,这不愿意只是在事后才后悔不及,永以为戒。
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    开心
    2014-3-31 11:51
  • 签到天数: 112 天

    [LV.6]常住居民II

    发表于 2012-7-26 06:29:39 手机频道 | 显示全部楼层
    这里也鼓励鼓励。回复鼓励一下,期待楼主更好作品
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    开心
    2012-12-28 13:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    发表于 2012-12-5 16:35:43 | 显示全部楼层
    一点也看不懂 不知道哪来干什么用的
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    开心
    2012-12-28 13:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    发表于 2012-12-5 16:38:19 | 显示全部楼层
    一点也看不懂 不知道哪来干什么用的
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    奋斗
    2024-4-8 08:42
  • 签到天数: 104 天

    [LV.6]常住居民II

    发表于 2013-1-31 22:43:47 | 显示全部楼层
    freqTextView
         .setText((mEqualizer.getCenterFreq(band) / 1000) + "HZ");
       mLayout.addView(freqTextView);
       LinearLayout row = new LinearLayout(this);
       row.setOrientation(LinearLayout.HORIZONTAL);
       TextView minDbTextView = new TextView(this);
       minDbTextView.setLayoutParams(new ViewGroup.LayoutParams(
         ViewGroup.LayoutParams.WRAP_CONTENT,
         ViewGroup.LayoutParams.WRAP_CONTENT));

    这部分没看懂啊
    启用邀请码注册,提高发帖质量,建设交流社区
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表