Pregunta

Estoy trabajando en una aplicación que procesa los datos de audio. Estoy usando Java (He añadido MP3SPI, JLayer y Tritonus). Estoy extracción de los datos de audio de un archivo .wav a una matriz de bytes. Las muestras de datos de audio con los que trabajo son de 16 bits estéreo.

De acuerdo con lo que he leído el formato para una muestra es la siguiente:

AABBCCDD

donde AABB representa canal izquierdo y canal CCDD rigth (2 bytes para cada canal). Que iba a necesitar para convertir esta muestra en un tipo de valor doble. He de leer acerca de formato de datos. Java utiliza big endian, archivos .wav utilizar Little Endian. Estoy un poco confundido. ¿Me podría ayudar con el proceso de conversión? Gracias a todos

¿Fue útil?

Solución

Advertencia: Los números enteros y bytes son firmados. Tal vez usted necesita para enmascarar los bytes bajos cuando el embalaje juntos:

for (int i =0; i < length; i += 4) {
    double left = (double)((bytes [i] & 0xff) | (bytes[i + 1] << 8));
    double right = (double)((bytes [i + 2] & 0xff) | (bytes[i + 3] << 8));

    ... your code here ...

}

Otros consejos

Cuando se utiliza la ByteBuffer ( java.nio.ByteBuffer ) se puede utilizar el método de orden;

[orden]

Para ByteBuffer public final (byteorder bo)

Modifies this buffer's byte order.

Parameters:
    bo - The new byte order, either BIG_ENDIAN or LITTLE_ENDIAN
Returns:
    This buffer

Después de esto, usted puede obtener los valores antes mencionados con;

getChar () getShort () getInt () getFloat () getDouble ()

¿Qué es un lenguaje de gran Java ;-)

Little Endian significa que los datos están en la forma BBAA y DDCC. Usted acaba de cambiar a su alrededor.

Desde el comienzo de la trama:

int left = (bytes[i+1] << 8) + bytes[i];
int right = (bytes[i+3] << 8) + bytes[i+2];

donde i es el índice de la muestra.

Me gustaría ver personalmente para una biblioteca que hace el intercambio de endian para usted. Cada formato de archivo de audio tiene supuestos acerca de la orden de bits para ti y para conseguir este derecho es difícil para todas las profundidades de bits / tipos de datos de archivos de la onda de soporte:

  • 8bit - uint8
  • 16bit - Int16
  • 24 bits - int32
  • 32 bits - int32 que float
  • 32 bits - float
  • 64 bits - doble

Si quieres apoyar a los tipos más comunes de archivos de sonido que necesita conversiones endian para todos estos tipos de datos.

Me gustaría ver ByteSwapper , que le dará la mayor parte byteswapping de los tipos mencionados anteriormente.

Es una pena de Java no tiene un campo de orden de bits en sus archivos clases IO. Ser capaz de simplemente abrir un archivo whos edianness es grande o pequeña es una solución mucho más fácil a este problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top