문제

현재 Android 장치에서 오디오 테스트를위한 루프 백 프로그램이 있습니다.

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 및 Audiorecord의 생성에서 볼 수 있듯이 인코딩은 Audioformat을 통해 제공되지만 16 비트 또는 8 비트 PCM 만 허용합니다.

나는 지금 내 자신의 G711 Codec 구현을 가지고 있으며 마이크에서 오디오를 인코딩하고 이어 피스로 들어가는 것을 디코딩 할 수 있기를 원합니다. Encode (short lin [], int 오프셋, 바이트 enc [], int 프레임) 그리고 decode (byte enc [], short lin [], int 프레임) 방법이지만 Audiorecord 및 Audiotrack에서 오디오를 인코딩하고 디코딩하는 방법을 사용하는 방법은 확실하지 않습니다.

누구든지 나를 도와 줄 수 있습니까?

도움이 되었습니까?

해결책

당신의 변화 arec.read(buffer, 0, buffersize) 사용하려면 전화하십시오 Bytebuffer read() 방법 AudioRecord.

일단 당신이 바이트가 들어가면 ByteBuffer 객체, G711 구현 호출을 삽입하고 사용할 수 있습니다. ByteBuffer.asShortBuffer() 캡처 된 PCM 데이터를 인코더로 가져 오는 방법.

그것은 당신을 위해 그 일을하기 위해 타사 도서관을 소개하지 않고도 당신의 초기 질문을 해결할 것입니다. (이 대답은 질문을 접한 미래의 사람들을위한 것입니다).

내 질문은 왜 그런가?

위의 코드에서 마이크에서 PCM 데이터를 캡처하고 재생을 위해 버퍼에 직접 작성하십시오.

구현에서 PCM-> G711 (ENCODE) -> G711 (DECODE) -> PCM의 경로를 따르는 것은 의미가 없습니다. 당신이하는 일은 불필요한 처리 및 대기 시간을 소개하는 것입니다. 이제 다른 스토리가 될 귀 조각을 통해 재생하려고 시도하는 대신 파일에 인코딩 된 데이터를 작성하려는 경우 현재 코드는 PCM 데이터를 인코딩하는 데 실제로 유용하지 않은 것처럼 보입니다.

여기에 자신의 코덱을 소개하는 것은 압축 된 음성 데이터를 파일에 (예 : 압축 된 방식으로 통화 데이터를 녹화) 네트워크 또는 다른 것을 통해 보내는 맥락에서만 적합합니다.

다른 팁

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top