我正在使用带有录制声音的缓冲区数组。我从服务器获取它们。它们都在一个线程中进行复活。 现在,我有4个线程 - 从/向服务器(主)读取/写入,录音,使用声音数据(从多个缓冲区到1)和声音播放线程。
但我有一个biiig问题 - 声音“编辑”线程无法跟上播放线程。我在编辑线程时做了什么 - 将所有缓冲区相加并将其除以缓冲区数。如果我只是做ObSound .put(buffer [0]) - 声音还可以。但是如果我将从那个缓冲区的第一个元素到最后一个元素 - 声音将“bug”。或者实际上它将“冻结”第二个,然后继续。继续。并且它的声音很棒,它会非常有趣。我认为你不喜欢我在“歌曲”中所说的意思。
Soo,我怎么从n声音缓冲区只有一个声音缓冲区?或者我如何“玩”它们?
我的部分代码:
static public void playSound() {
while (ObSound.peek() == null)
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
Byte[] Buff3 = ObSound.poll();
PlaySound.write(ArrayUtils.toPrimitive(Buff3),0,Buff3.length);
}
static public void recordSound() {
MicRec.read(buff, 0, buff.length);
try {
MicOS.write(buff,0,buff.length);
MicOS.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
//How do i make 1 buffer
Byte[] Buff2 = new Byte[buff2.length];
for (int j = 0;j<buff2.length;j+=2) {
long summ = 0;
for (int i1 = 0;i1<totalTh;i1++) {
summ += ((buff4[i1][j+1] & 0xFF) << 8) | (buff4[i1][j] & 0xFF);
}
byte res = (byte)(summ / totalTh);
Buff2[j] = (byte)(res & 0xff);
Buff2[j+1] = (byte)((res >> 8) & 0xff);
}
编辑:
Finnaly,发现了问题!实际上有两个问题:
res-byte的类型.Anad beacos res-summ为2个字节,他不能持有。第二个问题 - 由于某种原因,有时recordSound返回长度为“声音数组”的x2,以及那个beacos - 它正在删除结束它的第一个很简单 - 只需改变类型。
但如何解决第二个问题呢?当我们检测到数组更长的buff2.length - 只是削减它,一部分“处理”,第二部分 - 不要触摸。但是怎么做?呃,双面队列会有所帮助(又名Deque http://docs.oracle.com/javase/7/docs/api/java/util/Deque.html).PROFIT,its正在工作!
Ty evryone for“help”=)