2010-03-10 8 views
4

현재 Android 기기에서 Audio를 테스트하기위한 루프백 프로그램이 있습니다.Android - AudioRecord에 내 오디오 코덱을 추가하는 방법

AudioRecord와 AudioTrack을 사용하여 마이크에서 PCM 오디오를 녹음하고 이어폰에서 PCM 오디오를 재생합니다. 여기

코드입니다 :

public class Record extends Thread 
    { 

      static final int bufferSize = 200000; 
      final short[] buffer = new short[bufferSize]; 
      short[] readBuffer = new short[bufferSize]; 

      public void run() { 
      isRecording = true; 
      android.os.Process.setThreadPriority 
      (android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 

      int buffersize = AudioRecord.getMinBufferSize(11025, 
      AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT); 

          arec = new AudioRecord(MediaRecorder.AudioSource.MIC, 
              11025, 
              AudioFormat.CHANNEL_CONFIGURATION_MONO, 
              AudioFormat.ENCODING_PCM_16BIT, 
              buffersize); 

          atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 
              11025, 
              AudioFormat.CHANNEL_CONFIGURATION_MONO, 
              AudioFormat.ENCODING_PCM_16BIT, 
              buffersize, 
              AudioTrack.MODE_STREAM); 


          atrack.setPlaybackRate(11025); 

          byte[] buffer = new byte[buffersize]; 
          arec.startRecording(); 
          atrack.play(); 

          while(isRecording) { 

            arec.read(buffer, 0, buffersize); 
            atrack.write(buffer, 0, buffer.length); 
          } 
      } 
    } 

그래서 당신은 AudioTrack의 생성에보고 인코딩이 AudioFormat을 통해 공급되지만이 16 비트 또는 8 비트 PCM을 허용 가지 audiorecord 수있다.

나는 내 자신의 G711 코덱 구현을 가지고 있으며 마이크에서 오디오를 인코딩하고 이어 피스로 디코딩 할 수 있기를 원합니다. 따라서 (짧은 lin [], int 오프셋, 바이트 인코딩 [ ], int frames)디코드 (byte enc [], 짧은 lin [], int 프레임) 메서드를 사용하지만 인코딩 방법과 AudioRecord 및 AudioTrack의 오디오를 디코딩하는 방법은 확실하지 않습니다.

누구나 나를 도와 주거나 올바른 방향으로 나를 가리킬 수 있습니까?

+0

안녕하세요. Donal, 최종 구현으로이 질문을 업데이트 할 수 있습니까? 나는 성공하지 못하고 G711에서 인코딩/디코딩하려고하는 며칠 동안 노력 해왔다. 우리가 어떻게했는지 볼 수 있다면 환상적 일 것입니다 ...이 문제와 관련하여 많은 문제가 있습니다. 감사합니다. –

+0

안녕하세요 Juan, 더 이상 최종 솔루션이 없기 때문에 오랫동안 남겨두고 더 이상 솔루션의 코드를 기억하지 못하거나 사과 할 수있는 프로젝트의 일부였습니다. –

답변

1

arec.read(buffer, 0, buffersize) 전화 번호를 Bytebufferread()AudioRecord에서 변경하십시오.

ByteBuffer 개체에 바이트를 넣었 으면 encode의 G711 구현 호출을 삽입하고 ByteBuffer.asShortBuffer() 메서드를 사용하여 캡쳐 된 PCM 데이터를 인코더로 가져올 수 있습니다.

이렇게하면 써드 파티 라이브러리를 도입하지 않아도 초기 질문을 해결할 수 있습니다. (이 대답은 미래의 사람들을위한 것입니다.

내 질문은 왜입니까?

위의 코드에서 마이크에서 PCM 데이터를 캡처하여 재생을 위해 버퍼에 직접 쓸 수 있습니다.

구현시 PCM -> G711 (인코딩) -> G711 (디코딩) -> PCM 경로를 따르는 것이 의미가 없습니다. 당신이하고있는 일은 불필요한 프로세싱과 대기 시간을 초래하는 것입니다. 이제 인코딩 된 데이터를 이어 피스를 통해 재생하려고 시도하는 대신 파일에 쓰는 경우 다른 이야기가되지만 현재 코드는 실제로 PCM 데이터를 인코딩하는 데 유용하지 않습니다.

여기에서 자신의 코덱을 소개하는 것은 압축 된 음성 데이터를 파일에 기록 (예 : 압축 된 방식으로 통화 데이터 녹음)하거나 네트워크를 통해 전송하는 것과 관련하여 만 의미가 있습니다.

0

나는 이것이 꽤 오래된 게시물이라는 것을 알고 있습니다. 자신 만의 G711을 사용할 수 있었습니까? 내 자신의 초기 생각은 커널 용으로 컴파일 된 lib를 사용하고 JNI를 사용하여 호출하는 것입니다.

+0

이 질문 유형에 대한 원래 질문에 대한 의견을 사용하십시오. 더 자세한 정보를 얻기 전에 대답을 작성하지 마십시오. 행운을 빕니다!:) –

+0

안녕하세요 Chris, 저는 실제로 이것을 달성하기 위해 제 3 자 라이브러리를 사용했습니다. –

관련 문제