首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AudioRecord线程的处理

AudioRecord线程的处理
EN

Stack Overflow用户
提问于 2016-11-07 07:02:34
回答 1查看 999关注 0票数 2

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

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

代码语言:javascript
复制
//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();
}

重型加工的可运行性

代码语言:javascript
复制
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);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-07 11:11:40

每次创建一个新线程都要花费一些(discussion)。最好只创建一次繁重的处理线程,并向其提供音频示例。下面是一个例子:

代码语言:javascript
复制
// 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和音频示例是很重要的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40459490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档