2011-12-12 17 views
5

Argomenti simili su questa domanda includono solo il suono di riproduzione in mono in cui le frequenze sinistra e destra sono le stesse.Riproduci tono stereo in Android

La mia domanda è: come generare un tono stereo in modo che il canale sinistro abbia una frequenza diversa rispetto al canale destro?

Ho pensato di pre-registrare i file .wav ma registrare molti file .wav e metterlo nella cartella res non è una buona idea.

Mi sono imbattuto nella classe SoundPool e AudioTrack ma ho bisogno di uno snippet che mostri le diverse frequenze dei canali sinistro e destro memorizzati come buffer prima di riprodurre il tono.

Oppure ci sono altri modi? Si prega di fornire lo snippet desiderato.

risposta

4

ho mai provato questo:

  1. inizializzare le frequenze sinistro e destro
    //playback rate (1.0 = normal playback, range 0.5 to 2.0)
    float lFrequency = 1.0;
    float rFrequency = 1.0;

  2. inizializzare un oggetto
    SoundPool sp = SoundPool(2, AudioManager.STREAM_MUSIC, 0);

  3. SoundPool
  4. Caricare la pista due volte (load function)
    int sLeft = sp.load(mContext, R.raw.yourAudioFileId, 1);
    int sRight = sp.load(mContext, R.raw.yourAudioFileId, 1);

  5. giocare i 2 suoni (uno su sinistra e uno a destra) sulla base di aliquote diverse (play function)
    sp.play (sLeft, 1.0, 0.0, 0, 0, lFrequency);
    sp.play (sRight, 0.0, 1.0, 0, 0, rFrequency);

+0

Nel passaggio 4, penso che la frequenza sinistra e quella destra non giochino insieme. Ho bisogno di suonare la frequenza sinistra e destra insieme. –

+0

@ NeigylR.Noval Hai provato? Finché abbiamo costruito SoundPool usando 2 come max, entrambi suoneranno insieme. –

3

Dalla mia comprensione, se si utilizza SoundPoo Suonerà in stereo senza alcuna configurazione speciale. Dalla documentazione: "La libreria SoundPool utilizza il servizio MediaPlayer per decodificare l'audio in uno stream mono o stereo PCM a 16 bit non elaborato" in modo che il file riprodotto sia in stereo per iniziare, dovrebbe funzionare in questo modo.

1

Invece di pre-registrare i file WAV e incorporarli nell'applicazione, è possibile invece generare l'audio WAV a canale diviso in memoria dal codice e quindi salvarlo come file WAV che si desidera riprodurre con SoundPool o riprodurre il audio direttamente con AudioTrack (io consiglierei quest'ultimo).

L'audio stesso è solo una matrice di numeri interi (di solito) a 2 byte. Con stereo, i campioni sinistro e destro sono intercalati in tutto l'array (quindi il campione [0] è il primo campione L, il campione [1] è il primo campione R, il campione [2] è il secondo campione L ecc.). Quindi quando la tua app si avvia, dovrai creare un array per tutto il tempo necessario (con audio di qualità CD, l'array avrà bisogno di 88200 elementi per ogni secondo di audio), quindi riempire i campioni con i valori calcolati per il tono, quindi passare l'array su AudioTrack per giocare.

Oppure si salva l'audio come file WAV e si suona con SoundPool (che potrebbe effettivamente essere migliore dal punto di vista dell'impronta di memoria).Il formato WAV è molto semplice scrivere (lettura è più complicato): solo un'intestazione 44-byte con varie proprietà, e quindi i dati audio stesso.

Penso di aver già risposto a una domanda simile a Android prima, quindi vado a vedere se ho qualche codice di base per farlo.

Non

me, ma qualche buon codice per la lettura dei file WAV e la scrittura in java:

http://computermusicblog.com/blog/2008/08/29/reading-and-writing-wav-files-in-java

0

userei un altro software per generare un file .ogg stereo (non usare i file WAV, hanno peso troppo), che è un formato audio molto leggero che funziona bene in Android. Uso il mietitore gratuito, Audacity è più facile, chiunque lo farebbe. Basta creare due tracce audio mono, impostare il loro pan a tutto a destra e completamente a sinistra. Carica i tuoi campioni e applica un plug-change per modificare la frequenza di una delle tracce. Puoi anche generarli con un sintetizzatore. Quindi visualizza tutto in un file tone.ogg. Tone