0
현재 Android 용 앰프를 제작하려고합니다. 목표는 동시에 기록되는 내용을 기록하고 재생하는 것입니다. 내가 처리 할 스레드를 만들었습니다. 그러나 소리가 고르지 않게 나옵니다. 여기 내가 시도한 것이있다.Android 기록 및 재생
private class RecordAndPlay extends Thread{
int bufferSize;
AudioRecord aRecord;
short[] buffer;
public RecordAndPlay() {
bufferSize = AudioRecord.getMinBufferSize(22050, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
buffer = new short[bufferSize];
}
@Override
public void run() {
aRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 22050, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);
try {
aRecord.startRecording();
} catch (Exception e) {
}
int bufferedResult = aRecord.read(buffer,0,bufferSize);
final AudioTrack aTrack = new AudioTrack(AudioManager.STREAM_MUSIC, samplingRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferedResult, AudioTrack.MODE_STREAM);
aTrack.setNotificationMarkerPosition(bufferedResult);
aTrack.setPlaybackPositionUpdateListener(new OnPlaybackPositionUpdateListener() {
@Override
public void onPeriodicNotification(AudioTrack track) {
// TODO Auto-generated method stub
}
@Override
public void onMarkerReached(AudioTrack track) {
Log.d("Marker reached", "...");
aTrack.release();
aRecord.release();
run();
}
});
aTrack.play();
aTrack.write(buffer, 0, buffer.length);
}
public void cancel(){
aRecord.stop();
aRecord.release();
}
}
조언 해 주셔서 감사합니다. 언급하고 싶은 몇 가지 사항이 있습니다. 첫 번째는 새로운 AudioTrack을 만드는 것입니다. 이를 통해 프로그램 실행 속도가 빨라졌습니다. 두 번째는 내가 코드를 가지고 노는 동안 알아 낸 것입니다. buffer.length를 사용하는 대신 오디오를 재생할 때 buffereredResult를 사용했습니다. 나는 bufferedResult가 버퍼의 절반이라는 사실을 알아 냈습니다. 길이 때문에 나는 그것을 재생할 것을 요구했을 때 절반의 공백을 재생하고있었습니다 (따라서 choppiness). buffer.length에서 bufferedResult로 전환하면 초파리가 크게 줄어들었지만 약간의 지연이 있으며 대기열에 대한 조언을 사용하려고합니다. – piyushg91