用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字

leerduo    -  云代码空间

——

均衡器效果的实现

2014-01-12|2571阅||

摘要:好久没发帖了。用过百度音乐客户端的小伙伴都知道,百度音乐客户端有音效设置的功能,我喜欢设置成重低音。于是乎,就想知道它的实现原理,查了下android的sample在media下有个类:见图:  下面是这个类的代码: /*

好久没发帖了。用过百度音乐客户端的小伙伴都知道,百度音乐客户端有音效设置的功能,我喜欢设置成重低音。于是乎,就想知道它的实现原理,查了下android的sample在media下有个类:见图:
均衡器效果的实现 

下面是这个类的代码:
  1. /*
  2. * Copyright (C) 2010 The Android Open Source Project
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. *      http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */

  16. package com.example.android.apis.media;

  17. import com.example.android.apis.R;

  18. import android.app.Activity;
  19. import android.content.Context;
  20. import android.graphics.Canvas;
  21. import android.graphics.Color;
  22. import android.graphics.Paint;
  23. import android.graphics.Rect;
  24. import android.media.AudioManager;
  25. import android.media.MediaPlayer;
  26. import android.media.audiofx.Equalizer;
  27. import android.media.audiofx.Visualizer;
  28. import android.os.Bundle;
  29. import android.util.Log;
  30. import android.view.Gravity;
  31. import android.view.View;
  32. import android.view.ViewGroup;
  33. import android.widget.LinearLayout;
  34. import android.widget.SeekBar;
  35. import android.widget.TextView;




  36. public class AudioFxDemo extends Activity 
  37. {

  38.         
  39.     private static final String TAG = "AudioFxDemo";
  40.     //播放波形的高度
  41.     private static final float VISUALIZER_HEIGHT_DIP = 150f;
  42.     //播放器
  43.     private MediaPlayer mMediaPlayer;
  44.     
  45.     private Visualizer mVisualizer;
  46.     private Equalizer mEqualizer;

  47.     private LinearLayout mLinearLayout;
  48.     private VisualizerView mVisualizerView;
  49.     private TextView mStatusTextView;

  50.     @Override
  51.     public void onCreate(Bundle icicle) {
  52.         super.onCreate(icicle);

  53.         setVolumeControlStream(AudioManager.STREAM_MUSIC);

  54.         mStatusTextView = new TextView(this);

  55.         mLinearLayout = new LinearLayout(this);
  56.         mLinearLayout.setOrientation(LinearLayout.VERTICAL);
  57.         mLinearLayout.addView(mStatusTextView);

  58.         setContentView(mLinearLayout);

  59.         // Create the MediaPlayer
  60.         mMediaPlayer = MediaPlayer.create(this, R.raw.test_cbr);
  61.         Log.d(TAG, "MediaPlayer audio session ID: " + mMediaPlayer.getAudioSessionId());

  62.         setupVisualizerFxAndUI();
  63.         setupEqualizerFxAndUI();

  64.         // Make sure the visualizer is enabled only when you actually want to receive data, and
  65.         // when it makes sense to receive data.
  66.         mVisualizer.setEnabled(true);

  67.         // When the stream ends, we don't need to collect any more data. We don't do this in
  68.         // setupVisualizerFxAndUI because we likely want to have more, non-Visualizer related code
  69.         // in this callback.
  70.         mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
  71.             public void onCompletion(MediaPlayer mediaPlayer) {
  72.                 mVisualizer.setEnabled(false);
  73.             }
  74.         });

  75.         mMediaPlayer.start();
  76.         mStatusTextView.setText("Playing audio...");
  77.         mMediaPlayer.setLooping(true);
  78.     }
  79.     

  80.     private void setupEqualizerFxAndUI() {
  81.         // Create the Equalizer object (an AudioEffect subclass) and attach it to our media player,
  82.         // with a default priority (0).
  83.         mEqualizer = new Equalizer(0, mMediaPlayer.getAudioSessionId());
  84.         mEqualizer.setEnabled(true);

  85.         TextView eqTextView = new TextView(this);
  86.         eqTextView.setText("Equalizer:");
  87.         mLinearLayout.addView(eqTextView);

  88.         short bands = mEqualizer.getNumberOfBands();

  89.         final short minEQLevel = mEqualizer.getBandLevelRange()[0];
  90.         final short maxEQLevel = mEqualizer.getBandLevelRange()[1];

  91.         for (short i = 0; i < bands; i++) {
  92.             final short band = i;

  93.             TextView freqTextView = new TextView(this);
  94.             freqTextView.setLayoutParams(new ViewGroup.LayoutParams(
  95.                     ViewGroup.LayoutParams.FILL_PARENT,
  96.                     ViewGroup.LayoutParams.WRAP_CONTENT));
  97.             freqTextView.setGravity(Gravity.CENTER_HORIZONTAL);
  98.             freqTextView.setText((mEqualizer.getCenterFreq(band) / 1000) + " Hz");
  99.             mLinearLayout.addView(freqTextView);

  100.             LinearLayout row = new LinearLayout(this);
  101.             row.setOrientation(LinearLayout.HORIZONTAL);

  102.             TextView minDbTextView = new TextView(this);
  103.             minDbTextView.setLayoutParams(new ViewGroup.LayoutParams(
  104.                     ViewGroup.LayoutParams.WRAP_CONTENT,
  105.                     ViewGroup.LayoutParams.WRAP_CONTENT));
  106.             minDbTextView.setText((minEQLevel / 100) + " dB");

  107.             TextView maxDbTextView = new TextView(this);
  108.             maxDbTextView.setLayoutParams(new ViewGroup.LayoutParams(
  109.                     ViewGroup.LayoutParams.WRAP_CONTENT,
  110.                     ViewGroup.LayoutParams.WRAP_CONTENT));
  111.             maxDbTextView.setText((maxEQLevel / 100) + " dB");

  112.             LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
  113.                     ViewGroup.LayoutParams.FILL_PARENT,
  114.                     ViewGroup.LayoutParams.WRAP_CONTENT);
  115.             layoutParams.weight = 1;
  116.             SeekBar bar = new SeekBar(this);
  117.             bar.setLayoutParams(layoutParams);
  118.             bar.setMax(maxEQLevel - minEQLevel);
  119.             bar.setProgress(mEqualizer.getBandLevel(band));

  120.             bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
  121.                 public void onProgressChanged(SeekBar seekBar, int progress,
  122.                         boolean fromUser) {
  123.                     mEqualizer.setBandLevel(band, (short) (progress + minEQLevel));
  124.                 }

  125.                 public void onStartTrackingTouch(SeekBar seekBar) {}
  126.                 public void onStopTrackingTouch(SeekBar seekBar) {}
  127.             });

  128.             row.addView(minDbTextView);
  129.             row.addView(bar);
  130.             row.addView(maxDbTextView);

  131.             mLinearLayout.addView(row);
  132.         }
  133.     }

  134.     private void setupVisualizerFxAndUI() {
  135.         // Create a VisualizerView (defined below), which will render the simplified audio
  136.         // wave form to a Canvas.
  137.         mVisualizerView = new VisualizerView(this);
  138.         mVisualizerView.setLayoutParams(new ViewGroup.LayoutParams(
  139.                 ViewGroup.LayoutParams.FILL_PARENT,
  140.                 (int)(VISUALIZER_HEIGHT_DIP * getResources().getDisplayMetrics().density)));
  141.         mLinearLayout.addView(mVisualizerView);

  142.         // Create the Visualizer object and attach it to our media player.
  143.         mVisualizer = new Visualizer(mMediaPlayer.getAudioSessionId());
  144.         mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
  145.         mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener() {
  146.             public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes,
  147.                     int samplingRate) {
  148.                 mVisualizerView.updateVisualizer(bytes);
  149.             }

  150.             public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {}
  151.         }, Visualizer.getMaxCaptureRate() / 2, true, false);
  152.     }

  153.     @Override
  154.     protected void onPause() {
  155.         super.onPause();

  156.         if (isFinishing() && mMediaPlayer != null) {
  157.             mVisualizer.release();
  158.             mEqualizer.release();
  159.             mMediaPlayer.release();
  160.             mMediaPlayer = null;
  161.         }
  162.     }
  163. }

  164. /**
  165. * A simple class that draws waveform data received from a
  166. * {@link Visualizer.OnDataCaptureListener#onWaveFormDataCapture }
  167. */
  168. class VisualizerView extends View {
  169.     private byte[] mBytes;
  170.     private float[] mPoints;
  171.     private Rect mRect = new Rect();

  172.     private Paint mForePaint = new Paint();

  173.     public VisualizerView(Context context) {
  174.         super(context);
  175.         init();
  176.     }

  177.     private void init() {
  178.         mBytes = null;

  179.         mForePaint.setStrokeWidth(1f);
  180.         mForePaint.setAntiAlias(true);
  181.         mForePaint.setColor(Color.rgb(0, 128, 255));
  182.     }

  183.     public void updateVisualizer(byte[] bytes) {
  184.         mBytes = bytes;
  185.         invalidate();
  186.     }

  187.     @Override
  188.     protected void onDraw(Canvas canvas) {
  189.         super.onDraw(canvas);

  190.         if (mBytes == null) {
  191.             return;
  192.         }

  193.         if (mPoints == null || mPoints.length < mBytes.length * 4) {
  194.             mPoints = new float[mBytes.length * 4];
  195.         }

  196.         mRect.set(0, 0, getWidth(), getHeight());

  197.         for (int i = 0; i < mBytes.length - 1; i++) {
  198.             mPoints[i * 4] = mRect.width() * i / (mBytes.length - 1);
  199.             mPoints[i * 4 + 1] = mRect.height() / 2
  200.                     + ((byte) (mBytes[i] + 128)) * (mRect.height() / 2) / 128;
  201.             mPoints[i * 4 + 2] = mRect.width() * (i + 1) / (mBytes.length - 1);
  202.             mPoints[i * 4 + 3] = mRect.height() / 2
  203.                     + ((byte) (mBytes[i + 1] + 128)) * (mRect.height() / 2) / 128;
  204.         }

  205.         canvas.drawLines(mPoints, mForePaint);
  206.     }
  207. }
复制代码

实现效果如图:

均衡器效果的实现 




源代码打包:

顶 1踩 1收藏
文章评论
    发表评论

    个人资料

    • 昵称: leerduo
    • 等级: 初级程序员
    • 积分: 12
    • 代码: 0 个
    • 文章: 2 篇
    • 随想: 0 条
    • 访问: 1 次
    • 关注

    人气代码

      最新提问

        站长推荐