Frage

Ich arbeite an einer Anwendung, die Audiodaten verarbeitet. Ich verwende Java (ich habe MP3SPI, JLayer und Tritonus hinzugefügt). Ich extrahiere die Audiodaten aus einer .wav -Datei in ein Byte -Array. Die Audio -Datenmuster, mit denen ich arbeite, sind 16 Bit Stereo.

Nach dem, was ich für ein Beispiel gelesen habe, ist das Format:

Aabbccdd

wobei AABB den linken Kanal und den CCDD -Rigth -Kanal darstellt (2 Bytes für jeden Kanal). Ich müsste dieses Beispiel in einen Doppelwert -Typ konvertieren. Ich lese über das Datenformat. Java verwendet Big Endian, .WAV -Dateien verwenden Little Endian. Ich bin etwas durcheinander. Könnten Sie mir bitte beim Conversion -Prozess helfen? Danke euch allen

War es hilfreich?

Lösung

Warnung: Ganzzahlen und Bytes sind unterzeichnet. Vielleicht müssen Sie die niedrigen Bytes maskieren, wenn Sie sie zusammenpacken:

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

}

Andere Tipps

Wenn Sie den Bytebuffer verwenden (java.nio.bytebuffer) Sie können die Methodenreihenfolge verwenden;

bestellen

Öffentliche Bytebuffer Order (Byteorder Bo)

Modifies this buffer's byte order.

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

Danach können Sie die oben genannten Werte mit erhalten;

getChar () getShort () getInt () getfloat () getDouble ()

Was für eine großartige Sprache ist Java ;-)

Little Endian bedeutet, dass die Daten in Form BBAA und DDCC sind. Sie würden es einfach herumtauschen.

Vom Beginn des Rahmens:

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

Wo ich dein der Index deines Beispiels bin.

Ich würde persönlich nach einer Bibliothek suchen, die den Endian -Austausch gegen Sie durchführt. Jedes Audio -Datei -Format hat Annahmen über die Endiantress für Sie, und das Recht ist schwierig für alle Bit -Tiefen/Datentypen -Wellendateien, die Unterstützung für Wellendateien erhalten:

  • 8bit - uint8
  • 16bit - int16
  • 24bit - int32
  • 32bit - int32 als float
  • 32bit - Float
  • 64bit - Double

Wenn Sie die meisten gängigen Arten von Wellendateien unterstützen möchten, benötigen Sie für all diese Datentypen Endian Conversions.

Ich würde mich ansehen ByteSwapper, die Ihnen Byteswapping für die meisten oben aufgeführten Typen geben.

Es ist schade, dass Java kein Endianges -Feld in ihren Datei -IO -Klassen hat. Einfach eine Datei öffnen zu können, die groß oder wenig ist, ist eine viel einfachere Lösung für dieses Problem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top