마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

AudioRecord로 녹음 및 재생 음성 송수신 질문드립니다.

0 추천
이리저리 구글 도 찾아보고 어제 하루종일 삽질만하다 결국엔 여기에 질문글을 올리게 되네요..;;

1:1 무전기 기능을 구현하려하는 데 전에 질문올렸을 때 MediaRecorder 보다는 AudioRecord로 read시켜서 녹음한후

바로 전송하면 된다고 답변을 받았습니다. 그런데 구현하려고 찾아보니 예제도 많이 없고 너무 애매하고 모르는 부분이 많네요...

 

min = AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, min);

recordingThread = new Thread(new Runnable() {
     @Override
     public void run() {
      writeAudioDataToFile();
      }
      }, "AudioRecorder Thread");
     recordingThread.start();

 

private void writeAudioDataToFile() {
  sData = new short[min];
  while (isRecording) {
   audioRecord.read(sData, 0, sData.length);
  }
 }

 위에처럼 녹음을 구현시켜놨는 데

1. 저렇게 녹음 기능을 구현해놔도 별 문제 없을까요?

2. audioRecord.read로 받아놓고 파일에 output 처리하지 않고 바로 AudioTrack으로 재생 가능 한가요?

3 그리고 저 위에 8000이라고 해놓은거.저거 그냥 아무렇게나 해도 상관없는지..;;

그리고  AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT <<<이렇게 정의시켜놨는 데

각각 뭘 의미 하는지를 모르겠네요...;; ENCODING_PCM이야...PCM형태로 인코딩 하겠다는 건지..대충알겠는 데

CHANNEL_IN_MONO 이놈은 뭘의미 하는 건가요?

4. 아래코드에서 java.lang.IllegalArgumentException: Unsupported channel configuration. <<이런 오류가 나게됩니다.

AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,minBufferSize, AudioTrack.MODE_STREAM);

질문이 너무 많고 복잡한가요....;; 그런데 생각보다 audioRecord 놈으로 구현하기가 좀 까다롭네요...
와인한잔 (400 포인트) 님이 2013년 11월 29일 질문

1개의 답변

+1 추천
 
채택된 답변

1. VOICE_COMMUNICATION 의 경우 허니콤 이상 단말에서만 지원됩니다.

이전 단말을 지원하려면, 안드로이드 버젼 코드를 보고 분기하도록 해야 할 듯 합니다.

2. 재생 가능합니다. 단지 재생하는 소리가 마이크로 다시 들어가서 에코가 발생합니다.

3. samplingRate를 8000으로 잡으면, mp3의 44100, 48000 에 비해 다소 음질이 떨어지겠지만.
어지간한 단말에서는 잘 지원됩니다. 오히려 44100 48000 같은 것으로 설정하면 단말에 따라 지원하지 않을 수도 있으니. 무난할 듯 합니다. 
 
ENCODING_PCM_16BIT는 오디오 한데이터를 16bit로 표시한다는 의미이며, 굳이 수정할 필요 없으실 듯 합니다.
 
CHANNEL_IN_MONO 의 경우 1채널 오디오를 사용하겠다는 것이고,  2채널 오디오를 사용하려 CHANNEL_IN_STEREO 를 사용 하시면 됩니다.

 

4. 해당 단말에서 channel configuration 을 지원 못한다는 의미인듯 한데. AudioFormat.CHANNEL_IN_MONO 대신 CHANNEL_IN_STEREO 로 바꿔보세요. 물론 AudioRecord에서도 CHANNEL_IN_STEREO를 넣어 주셔야 합니다.

 

그래도 안된다면 AudioManager.STREAM_VOICE_CALL 대신 AudioManager.STREAM_MUSIC 를 넣어보세요.

 

사악미소 (65,330 포인트) 님이 2013년 11월 29일 답변
와인한잔님이 2013년 11월 29일 채택됨
친절한 답변 정말 감사드립니다..질문올린지 1시간도 안되 답변달아주시다니..ㅜㅜ
...