스레드에서 다음 코드를 사용하여 마이크에서 원시 오디오 샘플을 캡처하고 스피커를 통해 다시 재생합니다. record
는 AudioRecord
및 track
이다은 원시 PCM 캡처 및 재생을 위해 AudioRecord 및 AudioTrack이 어떻게 작동하는지 이해해야합니다.
public void run(){
short[] lin = new short[SIZE_OF_RECORD_ARRAY];
int num = 0;
// am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE); // -> MOVED THESE TO init()
// am.setMode(AudioManager.MODE_IN_COMMUNICATION);
record.startRecording();
track.play();
while (passThroughMode) {
// while (!isInterrupted()) {
num = record.read(lin, 0, SIZE_OF_RECORD_ARRAY);
for(i=0;i<lin.length;i++)
lin[i] *= WAV_SAMPLE_MULTIPLICATION_FACTOR;
track.write(lin, 0, num);
}
// /*
record.stop();
track.stop();
record.release();
track.release();
// */
}
는 Audiotrack
이다. AudioRecord가 PCM 데이터를 저장하는 방법과 AudioTrack이 PCM 데이터를 재생하는 방법을 자세히 (그리고 가능한 경우 간단하게) 알 필요가 있습니다. 이것은 지금까지를 이해하는 방법이다 : 그동안()의 루프와
계속 실행
도면에 도시 된 바와 같이,record
은 (지금은 1024 임) 시료 SIZE_OF_RECORD_ARRAY 번호를 취득한다. 샘플은 lin [] 배열의 반바지 (16 비트 PCM 인코딩을 사용함에 따라 16 비트 반바지)에 연속적으로 저장됩니다. 이것은
record.read()
에 의해 이루어집니다. 그런 다음
track.write()
은이 샘플을 하드웨어가 재생하는 스피커에 넣습니다. 이게 맞습니까? 아니면 여기에 뭔가 빠졌습니까?
미안하지만 '일반적으로 다양한 음향 보정 필터를 적용하는 일종의 DSP를 거친다'는 것은 무엇을 의미합니까? 이것은 마이크 입력의 디지털 표현이 마이크에있는 것과 정확하게 일치하지 않는다는 것을 의미합니까? 이미 하드웨어를 통해 어떤 방식으로 처리 되었습니까? – user13267
다시 'SIZE_OF_RECORD_ARRAY'를 변경해도 출력에 변형이 발생하지 않는 것으로 보입니다. 이 값을 아주 작게하면 출력에 지터 또는 프레임 건너 뛰기 효과가 발생하지만 어떤 것도 수행하지 않는 것 같습니다. – user13267
_ "이미 어떤 방식으로 처리 되었습니까?"_. 옳은.오디오를 녹음 할 때 적용되는 일반적인 필터는 자동 이득 제어 또는 동적 범위 압축 및 잡음 억제입니다. – Michael