2016-11-07 4 views
1

AudioRecord로 녹음 된 오디오를 스레드에서 처리하고 있지만 레코더 스레드에서 처리를 실행하면 일부 프레임이 삭제됩니다. android, AudioRecord.read() --> bufferoverflow, how to handle the buffer?에 따르면, 나는 별도의 스레드에서 처리를 실행해야하지만 어떻게? 모든 단일 프레임 (초당 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) 다소 비싸다. 무거운 처리 스레드를 한 번만 만들고 오디오 샘플을 제공하는 것이 좋습니다. 다음은 예입니다 :

// 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