如何在音频均衡器中添加立体声、高音选项?
How to add stereo,treble options in audio equalizer?
我正在尝试一个小型音频歌曲均衡器。我想在其中添加高音、立体声选项,就像在 Poweramp 播放器中一样。
我像这样成功地实现了 5 个频段的均衡器:-
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();
}
});
}
}
以上代码只是我的均衡器的简短介绍 code.it 不会像我在此处发布的示例一样工作。
.
我也想在我的均衡器中添加高音、立体声、单声道效果。
我已经像这样实现了低音增强:
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);
}
我使用内置 class 来增强低音。
如何向我的应用添加高音和 stereo/mono 效果?
为了改变低音、中音、高音,不需要使用 AudioTrack
对象(即使使用这个对象你只能播放非压缩的PCM 数据)。
您只需要使用 Equalizer
对象调整适当的频带级别。要获取可用频段的数量,只需调用:
myEqualizer.getNumberOfBands()
考虑到可用频段的数量,您现在可以使用以下方法设置每个频段的级别:
myEqualizer.setBandLevel(band, level);
其中:
band: frequency band that will have the new gain. The numbering of the
bands starts from 0 and ends at (number of bands - 1).
level: new gain
in millibels that will be set to the given band. getBandLevelRange()
will define the maximum and minimum values.
下图总结了从左到右每个波段的含义:
更新
要实现简单的 平衡 效果,只需区分播放器上的 left/right 音量(MediaPlayer
、SoundPool
、... ):
mediaPlayer.setVolume(left, right)
要获得 单声道 效果,您可以考虑使用 Virtualizer,它提供立体声加宽效果。您可以使用方法设置虚拟化效果的强度:
virtualizer.setStrength(1000); //range is [0..1000]
您需要仔细阅读 documentation 以检查您的虚拟器的当前配置是否真的被底层系统支持。
无论如何,这不是真正的单声道输出,我认为如果不使用低电平 API 例如 AudioTrack
(实际上 Poweramp 的音频管道依赖本机 JNI 库)。
如果您想使用 AudioTrack
进行播放,您需要考虑它仅支持 PCM 数据 (WAV) 作为输入:这意味着您将无法播放压缩的音频文件(如 MP3、flac、.. .) 直接,因为您需要先手动解码压缩的音频文件。
[Compressed File (MP3)] ===> decode() ===> [PCM data] ===> customEffect() ===> AudioTrack playback()
因此,为了使用 AudioTrack 播放压缩音频(并最终创建自定义效果),需要以下步骤:
- 使用decoder解码压缩文件(NO PUBLIC SYSTEM API可用,您需要手动完成!!!).
- 如有必要,将未压缩的数据转换为 PCM format which is compatible with AudioTrack
- (最终)将您的转换应用于 PCM 数据流(例如,您可以合并两个 L/R 通道并创建单声道效果)
- play the PCM stream using an AudioTrack
我建议你跳过这个效果;)
关于 bass-boost 效果,您需要检查 运行 设备(如虚拟器)是否支持您当前的配置。查看 here 了解更多信息。
我正在尝试一个小型音频歌曲均衡器。我想在其中添加高音、立体声选项,就像在 Poweramp 播放器中一样。
我像这样成功地实现了 5 个频段的均衡器:-
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();
}
});
}
}
以上代码只是我的均衡器的简短介绍 code.it 不会像我在此处发布的示例一样工作。 .
我也想在我的均衡器中添加高音、立体声、单声道效果。
我已经像这样实现了低音增强:
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);
}
我使用内置 class 来增强低音。
如何向我的应用添加高音和 stereo/mono 效果?
为了改变低音、中音、高音,不需要使用 AudioTrack
对象(即使使用这个对象你只能播放非压缩的PCM 数据)。
您只需要使用 Equalizer
对象调整适当的频带级别。要获取可用频段的数量,只需调用:
myEqualizer.getNumberOfBands()
考虑到可用频段的数量,您现在可以使用以下方法设置每个频段的级别:
myEqualizer.setBandLevel(band, level);
其中:
band: frequency band that will have the new gain. The numbering of the bands starts from 0 and ends at (number of bands - 1).
level: new gain in millibels that will be set to the given band. getBandLevelRange() will define the maximum and minimum values.
下图总结了从左到右每个波段的含义:
更新
要实现简单的 平衡 效果,只需区分播放器上的 left/right 音量(MediaPlayer
、SoundPool
、... ):
mediaPlayer.setVolume(left, right)
要获得 单声道 效果,您可以考虑使用 Virtualizer,它提供立体声加宽效果。您可以使用方法设置虚拟化效果的强度:
virtualizer.setStrength(1000); //range is [0..1000]
您需要仔细阅读 documentation 以检查您的虚拟器的当前配置是否真的被底层系统支持。
无论如何,这不是真正的单声道输出,我认为如果不使用低电平 API 例如 AudioTrack
(实际上 Poweramp 的音频管道依赖本机 JNI 库)。
如果您想使用 AudioTrack
进行播放,您需要考虑它仅支持 PCM 数据 (WAV) 作为输入:这意味着您将无法播放压缩的音频文件(如 MP3、flac、.. .) 直接,因为您需要先手动解码压缩的音频文件。
[Compressed File (MP3)] ===> decode() ===> [PCM data] ===> customEffect() ===> AudioTrack playback()
因此,为了使用 AudioTrack 播放压缩音频(并最终创建自定义效果),需要以下步骤:
- 使用decoder解码压缩文件(NO PUBLIC SYSTEM API可用,您需要手动完成!!!).
- 如有必要,将未压缩的数据转换为 PCM format which is compatible with AudioTrack
- (最终)将您的转换应用于 PCM 数据流(例如,您可以合并两个 L/R 通道并创建单声道效果)
- play the PCM stream using an AudioTrack
我建议你跳过这个效果;)
关于 bass-boost 效果,您需要检查 运行 设备(如虚拟器)是否支持您当前的配置。查看 here 了解更多信息。