comment convertir un tableau court en tableau d'octets
J'ai trouvé la conversion d'un court de tableau d'octetset tableau d'octets à court tableaumais pas à court de tableau de tableau d'octets.
Voici le code menant à la conversion
while(!stopped)
{
Log.i("Map", "Writing new data to buffer");
short[] buffer = buffers[ix++ % buffers.length];
N = recorder.read(buffer,0,buffer.length);
track.write(buffer, 0, buffer.length);
byte[] bytes2 = new byte[N];
J'ai essayé
int i = 0;
ByteBuffer byteBuf = ByteBuffer.allocate(N);
while (buffer.length >= i) {
byteBuf.putShort(buffer[i]);
i++;
}
bytes2 = byteBuf.array();
et
ByteBuffer.wrap(bytes2).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().put(buffer);
Cependant je reçois cette erreur sur les deux (l'erreur si pas exactement le même, mais très similaires pour les deux):
05-29 13:41:12.021: W/AudioTrack(9758): obtainBuffer() piste 0x30efa0
désactivé, le redémarrage de05-29 13:41:12.857: W/AudioWorker(9758): Erreur lors de la lecture de la voix
AudioWorker05-29 13:41:12.857: W/AudioWorker(9758):
java.nio.BufferOverflowException05-29 13:41:12.857: W/AudioWorker(9758):
java.nio.ShortBuffer.mettre(ShortBuffer.java:422)05-29 13:41:12.857: W/AudioWorker(9758):
java.nio.ShortToByteBufferAdapter.mettre(ShortToByteBufferAdapter.java:210)05-29 13:41:12.857: W/AudioWorker(9758):
java.nio.ShortBuffer.mettre(ShortBuffer.java:391)05-29 13:41:12.857: W/AudioWorker(9758):
com.avispl.unité néonatale des soins intensifs.l'audio.AudioWorker.exécuter(AudioWorker.java:126)
Et juste à donner autant d'informations que possible, voici le code qui utilise le tableau d'octets
Log.i("Map", "test");
//convert to ulaw
read(bytes2, 0, N);
//send to server
os.write(bytes2,0,bytes2.length);
System.out.println("bytesRead "+buffer.length);
System.out.println("data "+Arrays.toString(buffer));
}
source d'informationauteur owen gerig
Vous devez vous connecter pour publier un commentaire.
Java
short
est un type 16 bits, etbyte
est un 8 bits type. Vous avez une boucle qui essaie d'insérerN
shorts dans une mémoire tampon qui estN
-octets de long; il doit être2*N
octets de long pour s'adapter à toutes vos données.J'ai trouvé ByteBuffer à être le plus lent méthode de conversion des trois que j'ai décrites. Voir ci-dessous...
Plate-forme: Nexus S, Android 4.1.1, Pas de carte SIM
Méthode n ° 1: Utiliser un ByteBuffer
Méthode n ° 2: l'Ornement bits directement
Méthode n ° 3: Utilisation de C via JNI
TypeCast.java
natif.c
Résultats:
Pour un million d'élément d'entrée de la baie, le temps d'exécution est comme suit:
Méthode #1 ByteBuffer: 865 ms
Méthode #2 l'Ornement: 299 ms
Méthode #3 C: 39 ms