我想混合音频字节数组,但我没有成功对数组求和。(注意我已经添加了一些0的无声字节作为填充之前)。
我有一个ArrayList
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数组求和?
答案 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);
}