如何在音频均衡器中添加立体声,高音选项?

Ani*_*gla 7 java audio android equalizer android-layout

我正在尝试小型音频歌曲均衡器.我想在Poweramp播放器中加入高音,立体声等选项.

poweramp音乐播放器的图像

我成功实现了5个频段的equlizer如下: -

public class FragmentEqualizer extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        super.onCreateView(inflater,container,savedInstanceState);

        equalizer = new EQ(getActivity(), new Equalizer(0,com.androidhive.musicplayer.AndroidBuildingMusicPlayerActivity.mp.getAudioSessionId()));
       for(Bar bar : eqBars)
            bar.setActiveEQ();
       maximum= EQ.getEqualizer().getBandLevelRange()[1];
       minimum= EQ.getEqualizer().getBandLevelRange()[0];
    }


public void onActivityCreated(Bundle savedInstanceState) {
                super.onActivityCreated(savedInstanceState);


                   lvforprest.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                            @Override
                                    public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
                                btnformenu.setText(gtuforpresets.get(position).gtumcaFirstName);
                                if(position!=0 && position <=10)
                                {
                                    try
                                    {
                                 EQ.getEqualizer().usePreset((short) (position-1));
                          EQ.getEqualizer().setBandLevel((short)0,  EQ.getEqualizer().getBandLevel((short) 0));
                          EQ.getEqualizer().setBandLevel((short)1,  EQ.getEqualizer().getBandLevel((short) 1));
                          EQ.getEqualizer().setBandLevel((short)2, EQ.getEqualizer().getBandLevel((short) 2));
                          EQ.getEqualizer().setBandLevel((short)3,  EQ.getEqualizer().getBandLevel((short) 3));
                          EQ.getEqualizer().setBandLevel((short)4,  EQ.getEqualizer().getBandLevel((short) 4));

                          eqBars.get(0).setEQPosition(EQ.getEqualizer().getBandLevel((short) 0));
                          eqBars.get(1).setEQPosition(EQ.getEqualizer().getBandLevel((short) 1));
                          eqBars.get(2).setEQPosition(EQ.getEqualizer().getBandLevel((short) 2));
                          eqBars.get(3).setEQPosition(EQ.getEqualizer().getBandLevel((short) 3));
                          eqBars.get(4).setEQPosition(EQ.getEqualizer().getBandLevel((short) 4));
                          seekbar1katop.setText(EQ.getEqualizer().getBandLevel((short) 0)+"mB");
                          seekbar2katop.setText(EQ.getEqualizer().getBandLevel((short) 1)+"mB");
                          seekbar3katop.setText(EQ.getEqualizer().getBandLevel((short) 2)+"mB");
                          seekbar4katop.setText(EQ.getEqualizer().getBandLevel((short) 3)+"mB");
                          seekbar5katop.setText(EQ.getEqualizer().getBandLevel((short) 4)+"mB");


                                 }
                                    catch(IllegalStateException e)
                                    {
                                         Toast.makeText(getActivity(),"Unable",Toast.LENGTH_SHORT).show();

                                    }
                                    catch(IllegalArgumentException e)
                                {
                                         Toast.makeText(getActivity(),"Unable",Toast.LENGTH_SHORT).show();

                                    }
                                    catch(UnsupportedOperationException e)
                                    {
                                      Toast.makeText(getActivity(),"Unable",Toast.LENGTH_SHORT).show();

                                    }
                                }

                            //    Toast.makeText(getApplicationContext(),"You Clicked : " + mEqualizer.getEnabled(),Toast.LENGTH_SHORT).show();
                             }
                        });

}
}
Run Code Online (Sandbox Code Playgroud)

上面的代码只是我的均衡器代码的简短介绍.它不会像我在这里发布的例子一样工作..

我也想在均衡器中添加高音,立体声,单声道效果.

我已经实现了这样的低音增强:

public static void setBassBoost(BassBoost bassBoost, int percent) {
        try{
            bassBoost.setStrength((short) ((short) 1000 / 100 * percent));
            bassBoost.setEnabled(true);
        }catch (Exception e){

        }
    }

    public static void setBassBoostOff(BassBoost bassBoost) {
        bassBoost.setEnabled(false);
    }
Run Code Online (Sandbox Code Playgroud)

我使用了一个用于低音增强的inbulilt类.

如何在我的应用中添加高音和立体声/单声道效果?

bon*_*nyz 10

为了改变低音,中音,高音,不需要使用该AudioTrack对象(即使因为使用此对象,您只能播放非压缩的PCM数据).

您只需使用Equalizer对象调整适当的频段级别.要获得可用频段的数量,请致电:

myEqualizer.getNumberOfBands()
Run Code Online (Sandbox Code Playgroud)

考虑到可用频段的数量,您现在可以使用以下方法设置每个频段的级别:

myEqualizer.setBandLevel(band, level);
Run Code Online (Sandbox Code Playgroud)

哪里:

波段:将获得新增益的频段.频带的编号从0开始,以(频带数 - 1)结束.

level:将设置为给定波段的以毫微秒为单位的新增益.getBandLevelRange()将定义最大值和最小值.

从左到右的每个波段的含义总结在下图中:

乐队意义

UPDATE

要实现一个简单的平衡效果,只是区分播放器上的左/右音量(MediaPlayer,SoundPool,...):

mediaPlayer.setVolume(left, right)
Run Code Online (Sandbox Code Playgroud)

要获得单声道效果,您可以考虑使用提供立体声扩展效果的虚拟器.您可以使用以下方法设置虚拟化效果的强度:

virtualizer.setStrength(1000); //range is [0..1000]
Run Code Online (Sandbox Code Playgroud)

您需要仔细阅读文档,以检查底层系统是否真正支持虚拟器的当前配置.


无论如何,这是不是一个真正的单声道输出,我想你将无法获得立体声扬声器单声道输出中不使用低级别的API,如AudioTrack(实际上是后级依赖于本地JNI库的音频管道).如果你想使用AudioTrack播放,你需要考虑它只支持PCM数据(WAV)作为输入:这意味着你将无法直接播放压缩音频文件(如MP3,flac,...)需要先手动解码压缩的音频文件.

[Compressed File (MP3)] ===> decode() ===> [PCM data] ===> customEffect() ===> AudioTrack playback()
Run Code Online (Sandbox Code Playgroud)

因此,为了使用和AudioTrack播放压缩音频(并最终创建自定义效果),需要执行以下步骤:

  1. 使用解码器解码压缩文件(NO PUBLIC SYSTEM API可用于此,您需要手动执行!!!).
  2. 如有必要,以PCM格式转换未压缩数据,该格式与AudioTrack兼容
  3. (最终)在PCM数据流上应用您的转换(例如,您可以合并两个L/R通道并创建单声道效果)
  4. 使用AudioTrack播放PCM流

我建议你跳过这个效果;)


关于低音增强效果,您需要检查正在运行的设备(如虚拟器)是否支持您当前的配置.看看这里有关这方面的更多信息.