Android:AudioEffect——音樂特效控制

一,基本內容

          AudioEffect是定義在音頻 Framework 層的一種類(Class),由它派生出了 AcousticEchoCanceler,NoiseSuppressor,AutomaticGainControl,Equalizer、Virtualizer、BassBoost、PresetReverb等派生類。上層開發者使用這些派生類就可以聲明相應的 AudioEffect 對象了,再將其應用到 AudioTrack 或 MediaPlayer 實例上進行音效控制。AudioEffect 實際上是一個上層純軟件的概念,通過純軟件的方法對音效進行控制。

二,派生子類

AcousticEchoCanceler(取消回聲控制器)

除了從遠程捕捉到音頻信號上的信號的作用

AutomaticGainControl(自動增益控制)

自動恢復正常捕獲的信號輸出

NoiseSuppressor(噪聲抑制器)

可以消除被捕獲信號的背景噪音

Equalizer AudioEffect(均衡器)

    均衡器可以被用來改變特定音源輸入的頻率響應或經混音後的主要輸出音頻的頻率響應。

Virtualizer AudioEffect(示波器)

    示波器是對把各個聲道進行空間化的這類音效的統稱。這類音效的具體行爲與設備上輸入音頻的類型、聲道數和輸出音頻的聲道數有關。比如在一個立體聲輸入、立體聲耳機輸出的場景中,虛擬器實際執行的是立體聲擴展音效。

BassBoost AudioEffect(低音增強器)

    低音增強器被用於增強音頻中的低頻部分,相當於一個只能對低頻聲音進行增益控制的簡單均衡器。

PresetReverb AudioEffect(預設混響器)

    一個聲音在產生後會往各個方向傳播。如果這個聲音是在室內產生的,接收方會首先聽到音源本身發出的聲音,然後聽到來自牆壁、天花板和地板的回聲。這些回聲又會在傳播到障礙物上時產生二次回聲、三次回聲...接收方會持續不斷地聽到聲音,這每一次聲音的辨識度越來越低,且響度隨時間衰減。混響器(Reverb)對於音頻接收者的環境建模非常重要,它可以被用於模擬在不同環境中播放音樂產生的效果,或者在遊戲中爲玩家生成更加沉浸式的音頻體驗。APP 可以通過預設混響器提前配置全局的混響參數,這種方式在爲音樂播放添加混響效果時被廣泛使用。如果 APP 需要配置更高級的環境聲混響參數,最好使用環境聲混響器來實現。

三,實際應用

AcousticEchoCanceler(取消回聲控制器),NoiseSuppressor(自動增益控制),AutomaticGainControl (噪聲抑制器)

使用方法:

  • 調用靜態create()方法創建相應的實例
  • 調用isAvailable()方法判斷是否可用
  • 調用serEnaled(boolean enabled)方法啓用相應的效果

代碼(如果用其他的類,只需要簡單替換即可):

public class MainActivity extends Activity{
    Button play;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        play = findViewById(R.id.play);
        play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MediaPlayer mediaPlayer = MediaPlayer.create(MainActivity.this, R.raw.l);
                AcousticEchoCanceler acousticEchoCanceler = AcousticEchoCanceler.create(mediaPlayer.getAudioSessionId());
                if(acousticEchoCanceler.isAvailable()){  //檢查是否可用
                    //設置取消回聲功能
                    acousticEchoCanceler.setEnabled(true);
                }
                mediaPlayer.start();
            }
        });
    }
}

Equalizer(均衡器)、Virtualizer(示波器)、BassBoost(低音增強器)、PresetReverb(預設混響器)

使用方法:

  • 調用構造器創建實例
  • 調用AudioEffect的setEnabled(boolean enable)方法
  • 調用自己獨特的方法

代碼(類的創建方法基本一致,只需要調整seekbar監聽裏的細節):

BassBoost(低音增強器)

public class PlayActivity extends Activity {
    private BassBoost bassBoost = null;
    private TextView bassBostTextView;
    private SeekBar bassBostSeekBar;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.play);
        setupView();
        MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.l);
        bassBoost=new BassBoost(0,mediaPlayer.getAudioSessionId());
        mediaPlayer.start();
    }
    private void setupView() {
        bassBostTextView = (TextView) findViewById(R.id.bassBostTextView);
        bassBostSeekBar = (SeekBar) findViewById(R.id.bassBostSeekBar);
        bassBostSeekBar.setOnSeekBarChangeListener(mBassSeekbarChangerListener);
    }
    private SeekBar.OnSeekBarChangeListener mBassSeekbarChangerListener = new SeekBar.OnSeekBarChangeListener() {
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            if(null!= bassBoost){
                bassBoost.setStrength((short)(progress*10));
            }
            short strength = bassBoost.getRoundedStrength();
            boolean isSupported = bassBoost.getStrengthSupported();
            bassBostTextView.setText("strength = "+strength+isSupported);
        }
        public void onStartTrackingTouch(SeekBar seekBar) {
        }
        public void onStopTrackingTouch(SeekBar seekBar) {
        }
    };
}

Equalizer(均衡器)

private SeekBar.OnSeekBarChangeListener equalizerSeekBarChangerListener = new SeekBar.OnSeekBarChangeListener() {
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            short bands = equalizer.getNumberOfBands();     //均衡器得到其支持的頻譜引擎
            //bands=5,這裏可以是小於5的任意值,可以for循環設置多個
            final short minEqualizer = equalizer.getBandLevelRange()[0];    //最低的限度範圍
            final short maxEqualizer = equalizer.getBandLevelRange()[1];
            System.out.println(minEqualizer+"    "+maxEqualizer);
            short band = (short)(bands-1);
            if(null!= equalizer){
                equalizer.setBandLevel(band,(short)(progress*30-1500));
            }
           // short strength = equalizer.get();
            equalizerTextView.setText("strength = "+(short)(progress*30-1500));
        }
        public void onStartTrackingTouch(SeekBar seekBar) {
        }
        public void onStopTrackingTouch(SeekBar seekBar) {
        }
    };

Virtualizer(示波器)

private SeekBar.OnSeekBarChangeListener virtualivzerSeekBarSeekBarChangerListener = new SeekBar.OnSeekBarChangeListener() {
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            short strength = virtualizer.getRoundedStrength();//保存當前的值,方便還原
            virtualizer.setStrength((short) (progress*10));
            virtualivzerTextView.setText("strength = "+strength);
        }
        public void onStartTrackingTouch(SeekBar seekBar) {

        }
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    };

PresetReverb(預設混響器)

 private SeekBar.OnSeekBarChangeListener presetReverbSeekBarSeekBarChangerListener = new SeekBar.OnSeekBarChangeListener() {
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            presetReverb.setPreset((short)(progress%7));//注意參數PresetReverb.PRESET_LARGEROOM替換可查看源碼範圍
            short strength = presetReverb.getPreset();
            presetReverbTextView.setText("strength = "+strength);
        }

        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    };

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章