2013-08-21 7 views
0

스레드에서 다음 코드를 사용하여 마이크에서 원시 오디오 샘플을 캡처하고 스피커를 통해 다시 재생합니다. recordAudioRecordtrack이다은 원시 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 데이터를 재생하는 방법을 자세히 (그리고 가능한 경우 간단하게) 알 필요가 있습니다. 이것은 지금까지를 이해하는 방법이다 : 그동안()의 루프와

enter image description here

계속 실행

도면에 도시 된 바와 같이, record은 (지금은 1024 임) 시료 SIZE_OF_RECORD_ARRAY 번호를 취득한다. 샘플은 lin [] 배열의 반바지 (16 비트 PCM 인코딩을 사용함에 따라 16 비트 반바지)에 연속적으로 저장됩니다. 이것은 record.read()에 의해 이루어집니다. 그런 다음 track.write()은이 샘플을 하드웨어가 재생하는 스피커에 넣습니다. 이게 맞습니까? 아니면 여기에 뭔가 빠졌습니까?

답변

1

샘플을 메모리에 배치하는 방법은 다음과 같습니다. 그들은 이산 시간에 찍은 음파에 대한 선형 근사치의 배열입니다 (그림과 같이). 스테레오의 경우 샘플은 인터리브됩니다 (LRLRLRLR ...). 그것은 JNI를하게됩니다 AudioTrack 자바 (자바

  • 데이터 쓰기 : 그것은 오디오 걸리는 경로에 관해서 관련된 몇 단계가 있지만

    , 당신은, 본질적으로 맞아 네이티브 인터페이스)를 native helper class으로 호출하면 차례로 native AudioTrack class이 호출됩니다.

  • AudioTracks 주기적합니다 (AudioMixer 혼합 된) 주어진 출력 스레드 모든 AudioTracks 데이터를 취하고 audio HAL output stream class에 기록하는 AudioFlinger 의해 소유된다.

  • 거기에서 데이터는 user-space ALSA library으로 이동하고 중간 단계를 통해 kernel-space PCM driver으로 이동합니다. 그럼 거기에서 further on; 일반적으로 다양한 음향 보정 필터를 적용하는 일종의 DSP를 거쳐 스피커 DAC 및 앰프를 제어하는 ​​하드웨어 코덱으로 향합니다.

내장 마이크에서 녹음 할 때 반대 순서로 수행된다는 점을 제외하고는 거의 동일한 단계를 거칩니다.

일부 단계 (기본적으로 오디오 HAL 이하의 모든 항목)는 플랫폼마다 다르므로 다른 공급 업체의 플랫폼 (동일한 공급 업체의 다른 플랫폼도 다를 수 있음)에 유의하십시오.

+0

미안하지만 '일반적으로 다양한 음향 보정 필터를 적용하는 일종의 DSP를 거친다'는 것은 무엇을 의미합니까? 이것은 마이크 입력의 디지털 표현이 마이크에있는 것과 정확하게 일치하지 않는다는 것을 의미합니까? 이미 하드웨어를 통해 어떤 방식으로 처리 되었습니까? – user13267

+0

다시 'SIZE_OF_RECORD_ARRAY'를 변경해도 출력에 변형이 발생하지 않는 것으로 보입니다. 이 값을 아주 작게하면 출력에 지터 또는 프레임 건너 뛰기 효과가 발생하지만 어떤 것도 수행하지 않는 것 같습니다. – user13267

+0

_ "이미 어떤 방식으로 처리 되었습니까?"_. 옳은.오디오를 녹음 할 때 적용되는 일반적인 필터는 자동 이득 제어 또는 동적 범위 압축 및 잡음 억제입니다. – Michael