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

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

Изображение музыкального проигрывателя 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();
                             }
                        });

}
}

Вышеприведенный код является лишь кратким описанием моего кода эквалайзера. Он не будет работать, как пример, который я разместил здесь. .

Я тоже хочу добавить высокие частоты, стерео, моно эффекты в свой эквалайзер.

Я уже реализовал усиление басов следующим образом:

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);
    }

Я использовал встроенный класс для усиления басов.

Как я могу добавить в свое приложение высокие частоты и стерео/моно эффекты?


person Animesh Mangla    schedule 06.10.2015    source источник
comment
Чтобы управлять высокими и низкими частотами, используйте эффект эквалайзера и измените уровни полосы. Чтобы получить расширение стереобазы, используйте эффект виртуализатора. Я не уверен, что моно эффект должен делать.   -  person Michael    schedule 08.10.2015
comment
дайте мне эту демонстрацию или этот модуль. bcz у меня также есть визуализатор рабочего костюма   -  person Bipin Bharti    schedule 30.12.2016


Ответы (1)


Для изменения низких, средних и высоких частот нет необходимости использовать объект AudioTrack (даже потому, что с помощью этого объекта можно воспроизводить только несжатые данные PCM).

Вам просто нужно настроить правильный уровень частотных диапазонов, используя Equalizer объект. Чтобы узнать количество доступных диапазонов, просто позвоните:

myEqualizer.getNumberOfBands()

Учитывая количество доступных полос, теперь вы можете установить уровень для каждой полосы, используя следующий метод:

myEqualizer.setBandLevel(band, level);

куда:

полоса: полоса частот, которая будет иметь новое усиление. Нумерация полос начинается с 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

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


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

person bonnyz    schedule 08.10.2015
comment
@developer Mid означает средние частоты - person bonnyz; 08.10.2015
comment
я пытался сделать это. но это не работает, как в проигрывателе poweramp ..... я не могу получить какие-либо существенные изменения в звуке песни - person Animesh Mangla; 08.10.2015
comment
Объявление о стерео и моно? - person Animesh Mangla; 08.10.2015
comment
@developer Я обновил свой ответ, это все, что я знаю :) - person bonnyz; 08.10.2015
comment
@developer расскажи нам о своих сомнениях, я соответствующим образом обновлю свой ответ - person bonnyz; 09.10.2015
comment
да. Усиление басов - это просто усиление :-) - person bonnyz; 10.10.2015