Domanda

Sto lavorando a un'applicazione che elabora i dati audio. Sto usando Java (ho aggiunto MP3SPI, JLayer, e Tritonus). Sto estraendo i dati audio da un file .wav a un array di byte. I campioni di dati audio con cui sto lavorando sono 16 bit stereo.

Secondo quello che ho letto il formato per un campione è:

AABBCCDD

dove AABB rappresenta canale sinistro e CCDD canale rigth (2 byte per ciascun canale). Avrei bisogno di convertire questo campione in un tipo di valore doppio. Ho letto su formato dei dati. Java utilizza big endian, .wav file utilizzare little endian. Sono un po 'confuso. La prego di aiutarmi con il processo di conversione? Grazie a tutti

È stato utile?

Soluzione

Attenzione: interi e byte sono firmati. Forse avete bisogno di mascherare i byte bassi quando imballaggio insieme:

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 ...

}

Altri suggerimenti

Quando si utilizza il ByteBuffer ( java.nio.ByteBuffer ) è possibile utilizzare il metodo di ordine;

[ordine]

ordine pubblico ByteBuffer finale (byteorder bo)

Modifies this buffer's byte order.

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

Dopo questo è possibile ottenere i valori di cui sopra con;

getchar () getShort () getInt () getFloat () getDouble ()

Che grande lingua è Java ;-)

Little Endian significa che i dati sono in forma e BBAA DDCC. Si sarebbe solo scambiare intorno.

Fin dall'inizio del frame:

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

dove i è la tua l'indice del vostro campione.

Vorrei cercare personalmente per una libreria che fa l'Endian scambiare per voi. Ogni formato di file audio ha ipotesi circa l'endianness per voi e per ottenere questo diritto è difficile per tutte le profondità di bit / tipi di dati file wave supporto:

  • 8bit - uint8
  • 16bit - Int16
  • 24bit - int32
  • 32 bit - Int32 come float
  • 32 bit - float
  • 64bit - doppia

Se si desidera supportare più comuni tipi di file wave di cui ha bisogno conversioni endian per tutti questi tipi di dati.

Vorrei guardare ByteSwapper , che vi darà byteswapping per la maggior parte dei tipi sopra elencati.

Il suo male Java non ha un campo endianness nelle loro file classi IO. Essere in grado di aprire semplicemente un file whos edianness è grande o piccolo è una soluzione molto più semplice a questo problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top