【问题标题】:Processing in AudioRecord threadAudioRecord 线程中的处理
【发布时间】:2016-11-07 07:02:34
【问题描述】:

我正在线程中处理由 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);
    }
}

【问题讨论】:

  • 你最后是怎么解决这个问题的?能举个例子吗?

标签: java android multithreading audiorecord


【解决方案1】:

每次都创建一个新线程有点昂贵(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 以及音频样本很重要。

【讨论】:

  • @user09123789542 用于检查读取的字节数 (>= 0) 或任何错误代码 (read() 读取的字节数可能少于缓冲区大小 (documentation)
猜你喜欢
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多