android - android中的字节数组短

标签 android

由于某些原因,我需要将一段音频的样本转成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中,然后开一个线程来处理这个map。

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`

你能告诉我为什么以及如何解决这个问题吗?谢谢

最佳答案

您的代码有几个问题。首先,您在遍历 sampleBuffer 映射时从中删除元素。我很惊讶你没有异常(exception)。其次,您构建结果数组的方法效率极低并且会产生大量垃圾。您最好使用 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();
}

关于android - android中的字节数组短,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15564528/

相关文章:

android - Android GCM 注册 ID 是否始终以 "APA"开头?

android - GCM和FCM同一个项目

android - 如何开发使用 Google Calendar API 的 Android 应用程序

android - 关闭 Lua 状态并重新打开

android - 如何允许用户在 Firebase for Android 中创建私有(private)数据?

android - 谷歌眼镜 GDK : Bluetooth discoverable Intent

android - 我丢失了用于签署我的 apk 的 keystore 。可以在play store重新上传吗?

java - JazzyViewPager java.lang.ClassNotFoundException

java - 线程状态 TimedWait。如何调试?

Android解析plist到文档