2011-01-12 30 views
5

Sono nelle fasi di sviluppo di questa app, ma a guardarlo ho già riscontrato un problema. Devo essere in grado di riprodurre un file audio all'indietro (sai come rivelare messaggi nascosti;)). Non ho esperienza di lavoro con audio su Android e non ho idea se questo sia possibile.File audio inverso in Android

ho trovato una domanda qui che risolve il problema in java (Click Here For Question)

Ma questo fa uso della libreria javax.sound che Android non supporta. Avrò bisogno di questa libreria per risolvere questo problema o c'è un altro modo per invertire un file audio?

+0

Ciao @SamRowley Raggiungi il tuo obiettivo con l'algoritmo descritto? Copio esattamente la prima intestazione da 44 byte dall'originale per invertire il file audio e non riesco a riprodurre l'audio wav? Io uso sox e inverso l'audio e controllo che l'intestazione da 44 byte non sia esattamente? Per favore, se potessi aiutarmi con qualche consiglio, lo apprezzerò –

risposta

5

Un tipico file WAV è costituito da un'intestazione di 44 byte seguita dai valori di esempio effettivi. La dimensione di un "frame" dipende dalle proprietà del file WAV: un file stereo e 16 bit per campione avranno una dimensione di frame di 4 byte (due byte per il campione sinistro e due byte per l'esempio corretto).).

Quindi nel codice, si creerebbe un secondo file WAV creando un array di byte della stessa dimensione complessiva dell'originale. Copiate l'intestazione di 44 byte dall'originale nella copia, quindi iterate attraverso i fotogrammi originali iniziando dall'ultimo e lavorando in avanti fino al primo. Copiate ciascun fotogramma nella posizione inversa nell'array di copia (vale a dire l'ultimo fotogramma originale viene copiato nell'array di copia immediatamente dopo l'intestazione, il penultimo fotogramma viene copiato dopo il primo fotogramma ecc.). Quindi riproduci il file invertito.

Quindi non è necessaria la libreria javax.sound per eseguire questa operazione, è sufficiente essere in grado di copiare e manipolare i byte. Per vostra informazione, non tutti i file WAV sono "canonici" come questo (canonico significa intestazione di 44 byte più valori di esempio e nient'altro). Il formato WAV è in realtà un formato RIFF, il che significa che in teoria è necessario eseguire un'estrazione più complessa dei valori del campione. In pratica (specialmente se si stanno creando i file WAV da soli) di solito si può ottenere un approccio molto più semplice come ho descritto qui.

NOTA: se i suoni sono file MP3, l'operazione di inversione è più complessa, poiché i dati di esempio non vengono memorizzati come campioni in un file MP3. Se stai usando MP3, un modo per invertirli è convertirli in WAV e quindi invertire il file WAV.

+0

Sto creando il file WAV catturando l'audio dal microfono usando MediaRecorder, quindi immagino che in questo modo possa andare bene? Come farei per ottenere il file salvato dalla sdcard in un array di byte e copiare l'intestazione a 44 bit? Grazie per la tua prima risposta è stato utile finora e ho capito il concetto. – SamRowley

+1

Sì, il file WAV che si ottiene da MediaRecorder è molto probabilmente canonico, quindi dovresti stare bene. Ecco un collegamento con un altro codice che dovrebbe aiutarti a fare ciò che devi fare: http://www.dreamincode.net/forums/topic/171550-converting-short-array-to-byte-array-using-java- on-android-dispositivo / – MusiGenesis