Question

Je travaille sur une application qui traite les données audio. J'utilise java (je l'ai ajouté MP3SPI, JLayer et Tritonus). J'extraire les données audio d'un fichier .wav à un tableau d'octets. Les échantillons de données audio avec lesquels je travaille sont stéréo 16 bits.

D'après ce que j'ai lu le format d'un échantillon est:

AABBCCDD

où AABB représente le canal gauche et canal CCDD rigth (2 octets pour chaque canal). Je dois convertir cet échantillon en un type à double valeur. J'ai lu sur le format de données. Java utilise Big Endian, les fichiers .wav utilisent peu endian. Je suis un peu confuse. Pourriez-vous me aider avec s'il vous plaît le processus de conversion? Merci vous tous

Était-ce utile?

La solution

Attention: les entiers et les octets sont signés. Peut-être que vous avez besoin de masquer les octets bas lorsque les emballer ensemble:

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

}

Autres conseils

Lorsque vous utilisez le ByteBuffer ( java.nio.ByteBuffer ) vous pouvez utiliser l'ordre de la méthode;

[commande]

public final ordre ByteBuffer (bo ByteOrder)

Modifies this buffer's byte order.

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

Après cela, vous pouvez obtenir les valeurs mentionnées ci-dessus avec;

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

Quelle grande langue est Java ;-)

little endian signifie que les données sont sous la forme BBAA et DDCC. Vous simplement échanger autour.

Depuis le début du cadre:

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

où i est l'indice de votre échantillon.

Je regarderais personnellement une bibliothèque qui fait le endian échange pour vous. Chaque format de fichier audio a des hypothèses sur le boutisme pour vous et obtenir ce droit est difficile pour toutes les profondeurs de bits / datatypes fichiers Wave support:

  • 8bit - uint8
  • 16bit - int16
  • 24bit - int32
  • 32bit - int32 comme flotteur
  • 32bit - flotteur
  • 64bit - à double

Si vous voulez soutenir les types les plus courants de fichiers wave dont vous aurez besoin pour les conversions endian tous ces types de données.

Je regardais ByteSwapper , qui vous donnera byteswapping pour la plupart des types énumérés ci-dessus.

Son trop mal Java ne dispose pas d'un champ boutisme dans leurs fichiers des classes IO. Être capable de simplement ouvrir un fichier Whos edianness est grand ou petit est une solution beaucoup plus facile à cette question.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top