2014-05-19 8 views
2

wav 형식으로 녹음 할 때 안드로이드에서 샘플 당 비트 수가 AudioRecord 객체의 16 비트에서 8 비트 (또는 다른 비트 전송률)로 어떻게 변경 될 수 있습니까?Android에서 AudioRecord의 비트율 변경

(여기에서 예를 들어 설명한 바와 같이 : Using AudioRecord with 8-bit encoding in android) :이 작동하지 않습니다

private void WriteWaveFileHeader(
     FileOutputStream out, long totalAudioLen, 
     long totalDataLen, long longSampleRate, int channels, 
     long byteRate) throws IOException { 

     byte[] header = new byte[44]; 

     header[0] = 'R'; // RIFF/WAVE header 
     ...header content... 
     header[32] = (byte) (2 * 16/8); // block align 
     header[33] = 0; 
     header[34] = (byte)RECORDER_BPP; // bits per sample, set to 8 
     ...header content... 

     out.write(header, 0, 44); 
    } 

답변

2

AudioFormat.ENCODING_PCM_16BIT을 사용하여 16 비트 샘플을 녹음해야합니다. 8 비트 인코딩이 일반적으로 Android 기기에서 작동하지 않기 때문입니다.

그런 다음 웨이브 사운드 파일에 쓰기 전에 16 비트 버퍼를 8 비트로 변환하십시오. 그러나 8 비트 웨이브 파일은 부호없는 정수 (0-255)를 사용하기 때문에 0 대신 128이되는 무음으로 제안 된 변환으로이를 수정합니다.

// Your source above already defined a value for bufferSize and the recorder object 
sampleBufferShorts = new short[bufferSize]; 
sampleBufferBytes = new short[bufferSize]; 
int numberOfShortsRead = recorder.read(samleBufferShorts, 0, bufferSize); 
if (numberOfShortsRead != ERROR_INVALID_OPERATION && numberOfShortsRead != ERROR_BAD_VALUE) { 
    for (int i = 0 ; i < numberOfShortsRead ; ++i) 
     sampleBufferBytes[i] = (byte)((sampleBufferShorts[i]>>8)+128); 
} 

추가 디더링 결과 품질을 향상 왜 유용한 설명 https://stackoverflow.com/a/18777515/1986583을 참조하십시오 : 다음은 코드 골격이다.

+0

제안 된 버전과 직접 작동하는 Android 8 비트 인코딩 간의 출력간에 차이가 있습니까? – user2212461

+0

예, 'AudioFormat.ENCODING_PCM_8BIT'에서는 8 비트 값 0이 무음을 나타내고, 127은 최대 값이고 -128은 최소값을 나타냅니다. 내 코드의 "+128"은 웨이브 파일 형식에 맞도록이 값을 변경합니다. 읽기 후에 쓰기 전에 바이트를 처리하려면 wav 파일에 데이터를 저장하기 직전에 "+128"을 수행하는 것이 좋습니다. –

1

그것의 불가능, 당신은 당신의 .WAV를 후 처리해야합니다 : 헤더와

private static int RECORDER_AUDIO_ENCODING = 
     AudioFormat.ENCODING_PCM_8BIT; -->ERROR: Invalid Audio Format. 
bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,RECORDER_CHANNELS, 
     RECORDER_AUDIO_ENCODING); 
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,RECORDER_SAMPLERATE, 
     RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING, bufferSize); 

파일.