java - BufferSize 在 android AudioRecord 中减少

标签 java android

我正在尝试在 android 中将流媒体直播到服务器。我的程序运行良好。

开始流的方法是:

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 时,您的 buffer 分配将失败;数组的大小不能为负数。

关于java - BufferSize 在 android AudioRecord 中减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34048847/

相关文章:

android - Android布局中的Listview

android - 使用 RecyclerView 示例无法编译

java - 在 Camel 上使用 Springboot 的 Rest DSL 在重新启动 EAP 后创建路由抛出异常

java - Android CountDownTimer - 添加时间导致多个计时器运行

java - Projections.count() 和 Projections.countDistinct() 都产生相同的查询

javascript - 使用 loadUrl() 在 android webview 中加载 JavaScript

android - 当另一个应用程序开始转换时如何停止转换?

java - PowerMock PrepareForTest 注释导致 AmazonSQSClient 构造函数出现问题

java - 扬声器仅适用于两个联系人 Android

android - 我们如何检测到当前 View 由于滚动而超出可见范围?