2011-01-12 18 views
5

Estoy en las etapas muy eales de desarrollo de esta aplicación, pero mirándolo ya he llegado a un problema. Necesito poder reproducir un archivo de audio al revés (ya sabes, me gusta revelar mensajes ocultos;)). No tengo experiencia trabajando con audio en Android y no tengo idea de si esto es posible.Invertir archivo de audio en Android

me encontré con una pregunta aquí que resuelve el problema de java (Click Here For Question)

Pero esto hace uso de la biblioteca javax.sound el que Android no soporta. ¿Necesitaré esta biblioteca para resolver este problema o hay otra forma de revertir un archivo de audio?

+0

Hola @SamRowley ¿Logró su objetivo con el algoritmo descrito? Copio el primer encabezado de 44 bytes exactamente del archivo de audio original al inverso, y no pude hacer que se reprodujera el audio wav. Uso sox y audio inverso y compruebo que el encabezado de 44 bytes no es exactamente? Por favor, si me pueden ayudar con algún consejo lo agradeceré –

Respuesta

5

Un archivo WAV típico consiste en un encabezado de 44 bytes seguido de los valores de muestra reales. El tamaño de un "marco" depende de las propiedades del archivo WAV: un archivo que es estéreo y 16 bits por muestra tendrá un tamaño de fotograma de 4 bytes (dos bytes para la muestra izquierda y dos bytes para la muestra correcta))

Por lo tanto, en el código, crearía un segundo archivo WAV creando una matriz de bytes del mismo tamaño general que el original. Copia el encabezado de 44 bytes del original en la copia y luego itera por los marcos originales comenzando por el último y avanzando hasta el primero. Copie cada fotograma en la ubicación inversa en la matriz de copia (es decir, el último fotograma original se copia en la matriz de copia inmediatamente después del encabezado; el segundo hasta el último fotograma se copia después del primer fotograma, etc.). Entonces solo juega el archivo invertido.

Así que no necesita la biblioteca javax.sound para hacer esto, solo necesita poder copiar y manipular los bytes. FYI, no todos los archivos WAV son "canónicos" como este (canónico significa encabezado de 44 bytes más valores de muestra, y nada más). El formato WAV es en realidad un formato RIFF, lo que significa que en teoría necesita realizar una extracción más compleja de los valores de muestra. En la práctica (especialmente si está creando los archivos WAV), generalmente puede salirse con la suya con un enfoque mucho más simple, como lo describí aquí.

NOTA: si sus sonidos son archivos MP3, la inversión es una tarea más complicada, ya que los datos de muestra no se almacenan como muestras en un archivo MP3. Si usa MP3, una forma de invertirlos es convertirlos a WAV y luego invertir el archivo WAV.

+0

Estoy creando el archivo WAV capturando el audio del micrófono utilizando MediaRecorder, así que supongo que de esta manera estaría bien? ¿Cómo podría obtener el archivo guardado de la tarjeta SD en una matriz de bytes y copiar el encabezado de 44 bits? Gracias por su primera respuesta, ha sido útil hasta ahora y entiendo el concepto. – SamRowley

+1

Sí, el archivo WAV que obtiene de MediaRecorder es probablemente canónico, por lo que debería estar bien. Aquí hay un enlace con más código que debería ayudarle a hacer lo que necesita hacer: http://www.dreamincode.net/forums/topic/171550-converting-short-array-to-byte-array-using-java- dispositivo en android / – MusiGenesis