Java android AudioRecord中的缓冲区大小减少

Java android AudioRecord中的缓冲区大小减少,java,android,Java,Android,我正在尝试在安卓系统中向服务器直播流媒体。我的程序运行良好 开始流式处理的方法是: private void startStreaming() { Thread startRecord = new Thread( new Runnable() { @Override public void run() { try {

我正在尝试在安卓系统中向服务器直播流媒体。我的程序运行良好

开始流式处理的方法是:

private void startStreaming() {

    Thread startRecord = new Thread(
            new Runnable() {
                @Override
                public void run() {
                    try {
                        socket = new DatagramSocket();
                    } catch (SocketException e) {
                        e.printStackTrace();
                    }

                    buffer = new byte[minBufSize];

                    DatagramPacket packet;

                    try {
                         destination = InetAddress.getByName("10.31.0.12");
                    } catch (UnknownHostException e) {
                        e.printStackTrace();
                    }

                    record = new AudioRecord(MediaRecorder.AudioSource.MIC,sampleRate,channelConfig,audioFormat,minBufSize * 10);

                    record.startRecording();

                    while ( status )
                    {
                        minBufSize = record.read(buffer,0,buffer.length);
                        packet = new DatagramPacket(buffer,buffer.length,destination,port);
                        Log.d(LOG,"Writing in status " + destination );
                        try {
                            Log.d(LOG, "Trying to send. " + minBufSize);
                            socket.send(packet);
                            Log.d(LOG, "Sent successfully.");
                        } catch (IOException e) {

                            Log.d(LOG,"Socket is not sending properly.");
                            e.printStackTrace();
                        }
                    }

                }
            }
    );
    startRecord.start();
}
停止录制的方法:

public void stopRecording(View view) {
    start.setVisibility(View.VISIBLE);
    stop.setVisibility(View.GONE);
    status = false;
    Log.d(LOG,"I am about to release the record.");
    record.release();
    Log.d(LOG, "I have released.");
}
我正在使用minBufSize

 minBufSize = record.read(buffer,0,buffer.length);
如果我继续停止并播放录音,则
minBufSize
会不断减少。 值从1280变为512,从256变为-3,最后我得到:

java.lang.NegativeArraySizeException:-3 at
com.example.khan.safevoicerecorder.MainActivity$1.run(MainActivity.java:81)


为什么会这样?请帮我解决这个问题。

您可以使用当前的
minBufSize
创建
buffer
。然后,循环读取一段时间:
minBufSize=record.read(buffer,0,buffer.length)
。由于读取最多为
buffer.length
字节,您现在可能已经减少了
minBufSize

下次开始录制时,将使用新的更小的
minBufSize
创建缓冲区。同样,读取的数据最多为
buffer.length
字节(现在比上次小)


冲洗并重复——最后,你会得到一个非常小的缓冲液。我猜这会给你-3的错误值。最后,当
minBufSize
-3
时,您的
缓冲区分配将失败;数组的大小不能为负数。

我可以在每次开始录制时设置minBufSize,但仍不清楚为什么会出现上述情况。谢谢您的回答。虽然,我通过每次初始化minBufSize解决了这个问题,但是我无法理解。