안녕하세요 아즈라엘 입니다.
안펍의 고수님들께 오디오 관련하여 조언을 얻고자 질문합니다.
sampleRate frequency = 44100; 으로 오디로을 레코딩 하였습니다.
출력할때 outfrequency 부분을 소수점으로 계산하여 사운드 스피드를 조정하였으나
44100만 안되는 현상이 발견되었습니다.
int bufferSize = AudioTrack.getMinBufferSize((int)(44100 * 1.36f), channelConfiguration, audioEncoding);
그리하여 byte 단위로 끄집어내고 비트 쉬프트하여 샘플링 간격을 조정하여 출력 스피드를 조절하고자
시도 하는데 어떻게 해야 할지 모르겠네요 ㅠㅠ
일단 바이트 뽑아내는것 조차 안되고 있고.. 비트쉬프트를 어떻게 해야 할지도 고민입니다. ^^
대충 감으로만 어떻게 하면 될거 같다는것 까지만..실제 코드에 구현은 손도 못대고 있는 현실이 싫으네요 ㅠㅠ
---- 아래는 적용된 소스중 출력 부분입니다. ----
private class PlayAudio extends Thread {
private DataInputStream dis;
private AudioTrack audioTrack;
@Override
public void run() {
if (!new File(recordingFile).exists()) {
Log.e("#@#", "playAudio() -> recordingFile file not exist");
return;
}
int bufferSize = AudioTrack.getMinBufferSize(outfrequency, channelConfiguration, audioEncoding);
short[] audiodata = new short[bufferSize / 4];
try {
dis = new DataInputStream(new BufferedInputStream(new FileInputStream(recordingFile)));
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, outfrequency, channelConfiguration, audioEncoding, bufferSize,
AudioTrack.MODE_STREAM);
audioTrack.play();
while (dis.available() > 0) {
int i = 0;
while (dis.available() > 0 && i < audiodata.length) {
audiodata[i] = dis.readShort();
i++;
}
audioTrack.write(audiodata, 0, audiodata.length);
}
audioTrack.stop();
dis.close();
} catch (FileNotFoundException e) {
} catch (IOException e) {
} catch (IllegalStateException e) {
}
}
버퍼를 줄이고 읽어들이는걸 스킵해서 중복시켜 쓰면 되는군요
while (dis.available() > 0) {
int i = 0;
double k = 0;
while (dis.available() > 0 && k < audio_buf_size) {
try{
audiodata[(int)Math.ceil(k)] = dis.readShort();
k += speed;
i++;
}catch (IndexOutOfBoundsException e){
Log.i("#@#", "k=" + k + " i="+i +" dis_size=" + dis_size + " audio_buffer_size" + audio_buf_size);
break;
}
}
audioTrack.write(audiodata, 0, (int) Math.ceil(k));
}




인코딩을 AudioFormat.ENCODING_PCM_16BIT; 를 사용하여 short 형태로 핸들링 해야 한다면 비트단위를 어떻게 쉬프트하여 압축해야 음원이 빨라질까요?