2016-09-21 1 views
0

Je voudrais mixer un tableau d'octets audio, mais je n'ai pas réussi à additionner le tableau (notez que j'ai déjà ajouté des octets silencieux de 0 comme padding avant). Je un ArrayList de byte[] qui contient:Mixte byte array android

  • le premier byte [] est en-tête (44 octets).
  • ci-dessous byte [] sont tableau d'octets de données brutes à mélanger

Voici mon code:

ArrayList<byte[]> ListAudio = new ArrayList<byte[]>(); 
byte[] header= WriteHeader(); //wav header 44 bytes 
ListAudio.add(header); 
for (byte[] b : audioTreatment.ListDataByte) { 
     ListAudio.add(b); 
} 
//calculate total length of audio 
int length = 0; 
for (byte[] array : ListAudio) { 
length += array.length; 
} 

final int len = length; 
final byte[] mixBytes = new byte[len]; 
for (byte[] array : ListAudio) { 
for (int i = 44; i < len; ++i) { 
    mixBytes[i] += array[i]; 
    // mixBytes[i]=(byte) ((bytes1[i]+bytes2[i])/2); 

    } 
} 

J'ai trouvé quelque part que la méthode de mélanger tableau d'octets numérique est:

mixBytes[i]=(byte) ((bytes1[i]+bytes2[i])/2); 

Je n'arrive pas à inclure le calcul ci-dessus, pour additionner le tableau d'octets. Comment puis-je additionner le tableau d'octets de mon ArrayList?

+1

Uhm, quelle était la question? –

+0

Martin Frank, j'ai édité ma question, je vous remercie –

Répondre

1

vous devez déclarer vos sources pour les fusionner

byte[] source1 = ListAudio.get(0); //first from list 
byte[] source2 = ListAudio.get(1); //second from list 

int length = Math.min(source1.length, source2.length);//length of new array 
length = length - 44; //skipping 44 byte 

byte[] dest = new byte[length]; 
for(int index = 0; index < length; index ++){ 
    byte b1 = source1[index+44]; 
    byte b2 = source2[index+44]; 
    dest[index] = (byte) ((b1+b2)/2); 
} 

qui fusionnerait les deux premiers octets [] de votre liste.

Si vous souhaitez fusionner d'autres sources, vous pouvez les modifier en sélectionnant d'autres byte[] dans votre liste.

TRUC
La longueur de la destination est déclarée comme Math.min(a,b) mais vous pouvez remplir avec des zéros manquants octets si vous voulez ...

si vous souhaitez fusionner tous les tableaux, vous devez régler votre opération de fusion

mélange deux octets: mixBytes[i]=(byte) ((bytes1[i]+bytes2[i])/2);

mélange trois octets: mixBytes[i]=(byte) ((bytes1[i]+bytes2[i]+bytes3[i])/3);

mélange N octets: mixBytes[i]=(byte) ((bytes1[i]+bytes2[i]+bytes3[i]+...+bytesN[i])/N);

ok, votre code Snipped serait:

int length = ...;//length of result, either min or max as mentioned above, see HINT 
byte[] mixBytes = new byte[length]; 

int amountAudio = ListAudio.size(); //amount of tracks in your list aka 'N' 

int sum; 
for(int index = 0; index < length; index++){ 
    sum = 0; 
    for(byte[] source: ListAudio){ 
     //adding all byte into one big integer 
     sum = sum + source[index]; //NOTE: watch for indexOutOfBoundsException 
    } 
    //afterward divide the big int through amount of Audio tracks in your list 
    mixBytes[index] = (byte)(sum/amountAudio); 
} 
+0

je ne suis pas sûr si la conversion ('(byte1 + byte2)/2') fonctionne correctement, je le copie/pastd de votre code –

+0

Merci beaucoup, mais si ma source dans l'arraylist est dynamique et que je ne peux pas les déclarer statiquement, comment pourrais-je procéder? –

+0

uhm - je ne suis pas sûr de ce que vous voulez dire ... qu'est-ce qui est dynamique? le contenu de la liste? le contenu des tableaux dans la liste? –