由于某些原因,我需要将音频样本转换为byte []以进行网络传输。我找到了short2bytearray的函数
public static byte[] short2byte(short in) {
byte[] ret = new byte[2];
ret[0] = (byte) (in & 0xff);
ret[1] = (byte) ((in >> 8) & 0xff);
return ret;
}
因为音频一直在播放而且样本一直在播放,所以我首先将样本保存到HashMap中,然后打开一个线程来处理这个地图。
private void convert() {
Thread conv = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
// while (needConver) {
Iterator<Entry<Integer, short[]>> iter = sampleBuffer
.entrySet().iterator();
Log.i("Converting", "enter");
if (iter.hasNext()) {
Entry<Integer, short[]> entry = iter.next();
//stops in here
byte[] converted = new byte[entry.getValue().length * 2];
for (short in : entry.getValue()) {
Admin.combineByteArray(converted, Admin.short2byte(in));
}
convertedBuffer.put(entry.getKey(), converted);
sampleBuffer.remove(entry.getKey());
}
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// }
}
});
conv.start();
}
线程只会创建一次。我也希望它继续跟踪sampleBuffer并转换存储在其中的数据。但是,当我运行会话功能Admin.short2byte(in)
时,它会输出许多信息,如
`03-22 14:52:48.004: D/dalvikvm(24194): GC_FOR_ALLOC freed 4096K, 50% free 8517K/16839K, paused 13ms, total 13ms`
你可以告诉我为什么以及如何解决这个问题?谢谢
答案 0 :(得分:2)
您的代码存在一些问题。首先,在迭代它时,您将从sampleBuffer
地图中删除元素。我很惊讶你没有得到一个例外。其次,构建结果数组的方法非常低效并且会产生大量垃圾。最好使用java.nio.ByteBuffer
并删除short2byte
方法。我会写这样的代码:
private void convert() {
new Thread() {
@Override
public void run() {
for (Entry<Integer, short[]> entry : sampleBuffer.entrySet()) {
short[] values = entry.getValue();
byte[] converted = new byte[values.length * 2];
ByteBuffer buff = ByteBuffer.wrap(converted);
for (short in : values) {
buff.putShort(in);
}
convertedBuffer.put(entry.getKey(), converted);
}
}
}.start();
}