在 AudioRecord 线程中处理

Processing in AudioRecord thread

我正在一个线程中处理 AudioRecord 录制的音频,但是如果我 运行 在录音机线程中处理,一些帧会丢失。根据 android, AudioRecord.read() --> bufferoverflow, how to handle the buffer?,我需要 运行 在单独的线程中处理,但是如何呢?我是否需要为每一帧(每秒 2-3 个)创建一个新线程?

这是我目前的解决方案,但我想知道是否有更好的方法来做到这一点?

//in the AudioRecord thread
while (!break_condition) {
    int num_read = recorder.read(buffer, 0, buffer.length);
    HeavyProcessingRunnable myRunnable = new HeavyProcessingRunnable(buffer);
    Thread t = new Thread(myRunnable)
    t.start();
}

运行能够进行繁重的处理

public class HeavyProcessingRunnable implements Runnable {
    private byte[] var;
    public HeavyProcessingRunnable(byte[] var) {
        this.var = var;
    }
    public void run() {
        //if this is executed in audio recorder thread, frames get dropped
        someHeavyProcessing(var);
    }
}

每次都创建一个新线程有点昂贵(discussion)。最好只创建一次繁重的处理线程并为其提供音频样本。这是一个例子:

// Do it only once.

HandlerThread myHandlerThread = new HandlerThread("my-handler-thread");
myHandlerThread.start();

Handler myHandler = new Handler(myHandlerThread.getLooper(), new Handler.Callback() {
    @Override
    public boolean handleMessage(Message msg) {
        someHeavyProcessing((byte[]) msg.obj, msg.arg1);
        return true;
    }
});

// In audio recorder thread.
// Mind the handler reference.

while (!break_condition) {
    int num_read = recorder.read(buffer, 0, buffer.length);
    Message message = myHandler.obtainMessage();
    message.obj = buffer;
    message.arg1 = num_read;
    message.sendToTarget();
}

顺便说一下,提供 num_read 和音频样本很重要。