2015-10-06 15 views
7

Sto provando a un equalizzatore di brani audio di piccole dimensioni. Voglio aggiungervi opzioni di alti, stereo come nel player Poweramp.Come aggiungere le opzioni stereo, toni alti nell'equalizzatore audio?

Image of poweramp music player

ho implementato equlizer a 5 bande con successo in questo modo: -

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

} 
} 

Sopra il codice è solo un breve riassunto del mio equalizzatore code.It non funzionerà proprio come un esempio che ho postato qui. .

Anche io voglio aggiungere gli effetti acuti, stereo, mono nel mio equalizzatore.

ho già implementato la funzione Bass Boost in questo modo:

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

Ho usato una classe inbulilt per bass boost.

Come posso aggiungere effetti acuti e stereo/mono alla mia app?

+1

Per manipolare alti e bassi, utilizzare [Effetto equalizzatore] (http://developer.android.com/reference/android/media/audiofx/Equalizer.html) e modificare i livelli di banda. Per ottenere l'ingrandimento stereo, utilizzare [Effetto Virtualizer] (http://developer.android.com/reference/android/media/audiofx/Virtualizer.html). Non sono sicuro di cosa debba fare il "mono effetto". – Michael

+0

dammi una demo o questo modulo. bcz ho anche il costume visulizer –

risposta

9

Al fine di cambiare il bassi, medi, alti non c'è alcuna necessità di utilizzare l'oggetto AudioTrack (anche perché con questo oggetto è possibile riprodurre solo i dati PCM non compresso).

È sufficiente regolare il livello di bande di frequenza corretto utilizzando l'oggetto Equalizer. Per ottenere il numero di bande disponibili, basta chiamare:

myEqualizer.getNumberOfBands() 

Considerando il numero di bande disponibili, ora è possibile impostare il livello di ogni banda utilizzando il seguente metodo:

myEqualizer.setBandLevel(band, level); 

dove:

banda: banda di frequenza che avrà il nuovo guadagno. La numerazione delle bande inizia da 0 e termina a (numero di bande - 1).

livello: nuovo guadagno in millibels che verrà impostato sulla banda specificata. getBandLevelRange() definirà i valori massimo e minimo.

Il significato di ciascun bande, da sinistra a destra, è riassunto nella seguente immagine:

bands meaning

UPDATE

Per implementare un banale equilibrio effetto, basta differenziare il volume sinistro/destro del lettore (MediaPlayer, SoundPool, ...):

mediaPlayer.setVolume(left, right) 

Per ottenere un mono effetto che si può considerare l'utilizzo di un Virtualizer, che fornisce un effetto di amplificazione stereo. È possibile impostare l'intensità dell'effetto di virtualizzazione con il metodo:

virtualizer.setStrength(1000); //range is [0..1000] 

è necessario leggere il documentation con attenzione al fine di verificare se la configurazione attuale del virtualizzatore è realmente supportato dal sistema sottostante.


In ogni caso, questo non è un vero e proprio uscita mono e penso che non sarà in grado di ottenere un output mono su altoparlanti stereo senza l'uso di basso livello API come AudioTrack (realtà Poweramp si basa su librerie native JNI per la sua pipeline audio). Se si desidera utilizzare un AudioTrack per la riproduzione, è necessario considerare che supporta solo i dati PCM (WAV) come input: questo significa che non sarà possibile riprodurre file audio compressi (come MP3, flac, ...) direttamente dal momento che è necessario decodificare manualmente il file audio compresso prima.

[Compressed File (MP3)] ===> decode() ===> [PCM data] ===> customEffect() ===> AudioTrack playback() 

Pertanto, al fine di riprodurre un audio compresso utilizzando e AudioTrack (ed eventualmente creare un effetto personalizzato) sono necessari i seguenti passaggi:

  1. decodificare il file compresso utilizzando un decoder (NESSUNA API di SISTEMA PUBBLICO disponibile per questo, è necessario farlo manualmente !!!).
  2. se necessario, trasformare i dati non compressi in un PCM format which is compatible with AudioTrack
  3. (eventualmente) applicare la trasformazione sul flusso di dati PCM (ad esempio, è possibile unire i due canali L/R e creare un effetto mono)
  4. play the PCM stream using an AudioTrack

vi suggerisco di saltare questo effetto;)


per quanto riguarda la bass-boost ef giusto, è necessario verificare se la configurazione corrente è supportata dal dispositivo in esecuzione (come il virtualizzatore). Dai un'occhiata a here per maggiori informazioni su questo.

+0

Mid qui significa? –

+0

@developer * Mid * sta per * frequenze midrange * – bonnyz

+0

ho provato a fare questo.ma non funziona come nel player poweramp ..... non posso avere alcun cambiamento significativo nell'audio del brano –