混合字节数组android

时间:2016-09-21 10:14:30

标签: java android arrays mix

我想混合音频字节数组,但我没有成功对数组求和。(注意我已经添加了一些0的无声字节作为填充之前)。 我有一个ArrayList byte[],其中包含:

  • 第一个字节[]是标题(44个字节)。
  • 以下byte []是要混合的原始数据字节数组

这是我的代码:

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);

     }
}

我发现混合数字字节数组的方法是:

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

我没有到达包含上面的计算结果来对字节数组求和。 如何从我的ArrayList中对bytes数组求和?

1 个答案:

答案 0 :(得分:1)

你必须声明你的来源合并它们

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);
}

这将合并列表中的前两个字节[]。

如果要合并其他来源,可以通过从列表中选择其他byte[]来更改这些来源。

HINT
目标的长度声明为Math.min(a,b),但如果您愿意,可以用零填充缺少的字节...

如果要合并所有数组,则必须调整合并操作

混合两个字节:mixBytes[i]=(byte) ((bytes1[i]+bytes2[i]) / 2);

混合三个字节:mixBytes[i]=(byte) ((bytes1[i]+bytes2[i]+bytes3[i]) / 3);

混合 N 字节:mixBytes[i]=(byte) ((bytes1[i]+bytes2[i]+bytes3[i]+...+bytesN[i]) / N);

好的,对于你的代码剪断它将是:

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);
}