2016-11-07 33 views
1

AudioRecordで録音したオーディオをスレッドで処理していますが、レコーダースレッドで処理を実行すると、一部のフレームが破棄されます。 android, AudioRecord.read() --> bufferoverflow, how to handle the buffer?によると、私は別のスレッドで処理を実行する必要がありますが、どのように? 1つのフレームごとに新しいスレッドを作成する必要がありますか(毎秒2〜3回)?AudioRecordスレッドでの処理

ここに私の現在の解決策がありますが、これを行うより良い方法があるのでしょうか?

//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); 
    } 
} 

答えて

0

重い処理のために実行可能では(discussion)やや高価です。重い処理スレッドを1回だけ作成し、オーディオサンプルを供給する方がよいでしょう。ここでは例です:

// 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を提供することが重要です。

+0

num_readは、> 0かどうかを調べるためのものですか? –

+0

@ user09123789542読み込みバイト数(> = 0)またはエラーコード(<0)のチェック。 'read()'は、バッファサイズ[(ドキュメント)](https://developer.android.com/reference/android/media/AudioRecord.html#read(byte []、%20int、%20int) ))。 – nandsito

関連する問題