Как добавить стерео, высокие частоты в аудио эквалайзере?

Я пытаюсь небольшой аудио эквалайзер песни. Я хочу добавить в него параметры высоких частот, стерео, как в проигрывателе Poweramp.

Изображение музыкального проигрывателя 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 (и, в конечном итоге, для создания собственного эффекта) необходимы следующие шаги:

  1. расшифруйте сжатый файл с помощью декодера (для этогонет API-интерфейса ОБЩЕСТВЕННОЙ СИСТЕМЫ, вам нужно сделать это вручную!!!).
  2. при необходимости преобразуйте несжатые данные в формат PCM, совместимый с AudioTrack
  3. (в конце концов) применить преобразование к потоку данных PCM (например, вы можете объединить оба канала L/R и создать моноэффект)
  4. воспроизвести поток PCM с помощью AudioTrack

Я предлагаю вам пропустить этот эффект;)


Что касается эффекта усиления басов, вам нужно проверить, поддерживается ли ваша текущая конфигурация запущенным устройством (например, виртуализатором). Посмотрите здесь для получения дополнительной информации об этом.

Другие вопросы по тегам