1

いくつかの理由で、ネットワーク送信のためにオーディオのサンプルを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();
    }

スレッドは1回だけ作成されます。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`

これを修正する理由と方法を教えてください。ありがとうございました

4

1 に答える 1

2

コードにはいくつかの問題があります。sampleBufferまず、反復処理中にマップから要素を削除します。あなたがそれで例外を受けていないことに驚いています。第二に、結果配列を作成する方法は非常に非効率的であり、大量のゴミが生成されます。java.nio.ByteBuffera を使用してメソッドを削除する方がよいでしょう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();
}
于 2013-03-22T07:20:50.640 に答える