[英]How to add stereo,treble options in audio equalizer?
我正在尝试小型音频歌曲均衡器。 我想在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();
}
});
}
}
上面的代码只是我的均衡器代码的简短介绍。它不会像我在这里发布的例子一样工作。 。
我也想在均衡器中添加高音,立体声,单声道效果。
我已经实现了这样的低音增强:
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);
}
我使用了一个用于低音增强的inbulilt类。
如何在我的应用中添加高音和立体声/单声道效果?
为了改变低音,中音,高音,不需要使用AudioTrack
对象(即使因为这个对象你只能播放非压缩的PCM数据)。
您只需使用Equalizer
对象调整适当的频段级别。 要获得可用频段的数量,请致电:
myEqualizer.getNumberOfBands()
考虑到可用频段的数量,您现在可以使用以下方法设置每个频段的级别:
myEqualizer.setBandLevel(band, level);
哪里:
波段 :将获得新增益的频段。 频带的编号从0开始,以(频带数 - 1)结束。
level :将设置为给定波段的以毫微秒为单位的新增益。 getBandLevelRange()将定义最大值和最小值。
从左到右的每个波段的含义总结在下图中:
UPDATE
要实现平凡的平衡效果,只需区分播放器上的左/右音量( MediaPlayer
, SoundPool
,...):
mediaPlayer.setVolume(left, right)
要获得单声道效果,您可以考虑使用提供立体声扩展效果的虚拟器 。 您可以使用以下方法设置虚拟化效果的强度:
virtualizer.setStrength(1000); //range is [0..1000]
您需要仔细阅读文档 ,以检查底层系统是否真正支持虚拟器的当前配置。
无论如何,这不是真正的单声道输出,我认为如果不使用AudioTrack
等低级API,你将无法在立体声扬声器上获得单声道输出( 实际上Poweramp依赖原生JNI库作为其音频管道 )。 如果你想使用AudioTrack
进行播放,你需要考虑它只支持PCM数据(WAV)作为输入:这意味着你将无法直接播放压缩音频文件(如MP3,flac,...)您需要先手动解码压缩的音频文件。
[Compressed File (MP3)] ===> decode() ===> [PCM data] ===> customEffect() ===> AudioTrack playback()
因此,为了使用和AudioTrack播放压缩音频 (并最终创建自定义效果),需要执行以下步骤:
我建议你跳过这个效果;)
关于低音增强效果,您需要检查正在运行的设备(如虚拟器)是否支持您当前的配置。 看看这里有关这方面的更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.