Как добавить стерео, высокие частоты в аудио эквалайзере?
Я пытаюсь небольшой аудио эквалайзер песни. Я хочу добавить в него параметры высоких частот, стерео, как в проигрывателе Poweramp.
Я успешно реализовал equlizer с 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);
}
Я использовал встроенный класс для усиления басов.
Как я могу добавить высокие и стерео / моно эффекты в свое приложение?
1 ответ
Для изменения низких, средних и высоких частот нет необходимости использоватьAudioTrack
объект (даже потому, что с этим объектом вы можете воспроизводить только несжатые данные PCM).
Вам просто нужно отрегулировать правильный уровень частотных полос, используя Equalizer
объект. Чтобы узнать количество доступных диапазонов, просто позвоните:
myEqualizer.getNumberOfBands()
Учитывая количество доступных диапазонов, теперь вы можете установить уровень для каждого диапазона, используя следующий метод:
myEqualizer.setBandLevel(band, level);
где:
band:полоса частот, которая будет иметь новый коэффициент усиления. Нумерация полос начинается с 0 и заканчивается в (количество полос - 1).
уровень: новое усиление в миллибелах, которое будет установлено для данной полосы. getBandLevelRange() определит максимальное и минимальное значения.
Значение каждой полосы слева направо обобщено на следующем рисунке:
ОБНОВИТЬ
Чтобы реализовать тривиальный эффект баланса, просто различайте левую / правую громкость на вашем плеере (MediaPlayer
, SoundPool
,...):
mediaPlayer.setVolume(left, right)
Чтобы получить эффект моно, вы можете использовать виртуализатор, который обеспечивает эффект расширения стерео. Вы можете установить силу эффекта виртуализации, используя метод:
virtualizer.setStrength(1000); //range is [0..1000]
Вам необходимо внимательно прочитать документацию, чтобы проверить, действительно ли текущая конфигурация вашего виртуализатора поддерживается базовой системой.
В любом случае, это не настоящий монофонический выход, и я думаю, что вы не сможете получить монофонический выход на стереодинамике без использования низкоуровневого API, такого как AudioTrack
(насамом деле Poweramp опирается на нативные библиотеки JNI для своего аудио-конвейера). Если вы хотите использовать AudioTrack
для воспроизведения вы должны учитывать, что он поддерживает только данные PCM (WAV) в качестве входных данных: это означает, что вы не сможете воспроизводить сжатый аудиофайл (например, MP3, flac, ...) напрямую, поскольку вам нужно вручную декодировать сжатый файл. аудио файл первым.
[Compressed File (MP3)] ===> decode() ===> [PCM data] ===> customEffect() ===> AudioTrack playback()
Таким образом, для воспроизведения сжатого звука с использованием AudioTrack (и, в конечном итоге, для создания собственного эффекта) необходимы следующие шаги:
- расшифруйте сжатый файл с помощью декодера (для этогонет API-интерфейса ОБЩЕСТВЕННОЙ СИСТЕМЫ, вам нужно сделать это вручную!!!).
- при необходимости преобразуйте несжатые данные в формат PCM, совместимый с AudioTrack
- (в конце концов) применить преобразование к потоку данных PCM (например, вы можете объединить оба канала L/R и создать моноэффект)
- воспроизвести поток PCM с помощью AudioTrack
Я предлагаю вам пропустить этот эффект;)
Что касается эффекта усиления басов, вам нужно проверить, поддерживается ли ваша текущая конфигурация запущенным устройством (например, виртуализатором). Посмотрите здесь для получения дополнительной информации об этом.