audiotrack을 통해 pcm 데이터를 재생하려고 할 때 jLayer lib를 사용하여 mp3를 디코딩하면 많은 오디오 왜곡이 발생합니다. audiotrack에서 PCm 데이터 재생
내 디코더 코드 :public static void decode(String path, int startMs, int maxMs)
throws IOException {
ByteArrayOutputStream outStream = new ByteArrayOutputStream(1024);
float totalMs = 0;
boolean seeking = true;
File file = new File(path);
System.out.println("the data "+path);
InputStream inputStream = new BufferedInputStream(new FileInputStream(file), 8 * 1024);
try {
Bitstream bitstream = new Bitstream(inputStream);
Decoder decoder = new Decoder();
boolean done = false;
while (! done) {
javazoom.jl.decoder.Header frameHeader = bitstream.readFrame();
if (frameHeader == null) {
done = true;
} else {
totalMs += frameHeader.ms_per_frame();
if (totalMs >= startMs) {
seeking = false;
}
if (! seeking) {
SampleBuffer output = (SampleBuffer) decoder.decodeFrame(frameHeader, bitstream);
if (output.getSampleFrequency() != 44100
|| output.getChannelCount() != 2) {
// throw new com.mindtherobot.libs.mpg.DecoderException("mono or non-44100 MP3 not supported");
}
short[] pcm = output.getBuffer();
byte[] bs;
int index=0;
ByteBuffer buffer;
buffer = ByteBuffer.allocate(2*pcm.length);
for (short s : pcm) {
// outStream.write(s & 0xff);
// outStream.write((s >> 8) & 0xff);
buffer.putShort(s);
}
byte[] dataaudio = buffer.array();
//return buffer.array();
track.write(dataaudio, 0, dataaudio.length);
}
if (totalMs >= (startMs + maxMs)) {
done = true;
}
}
bitstream.closeFrame();
}
//return outStream.toByteArray();
} catch (BitstreamException e) {
throw new IOException("Bitstream error: " + e);
} catch (DecoderException e) {
Log.w("data", "Decoder error", e);
;
} finally {
// IOUtils.safeClose(inputStream);
}
}
왜 MediaPlayer를 사용하지 않으십니까? 자동으로 오디오 파일을 디코딩하여 다시 재생합니다. – tiguchi
답장을 보내 주셔서 감사합니다. 실제로 다른 장치로 데이터를 스트리밍하고 싶습니다 ... – user2705259
나는 어쩌면 네이티브 MP3 디코더 라이브러리에 시도해보아야 할 것입니다. Java로 작성된 디코더보다 빠르며 오디오 왜곡 문제도 없앨 수 있습니다. – tiguchi