안드로이드
ringdroid에 JLayer MP3 디코더 적용하기
dumpcookie
2014. 9. 12. 11:34
MAD 라이브러리 라이선스가 GPL이다보니 다른 라이선스를 가진 MP3 디코더를 찾아보다가 JLayer를 적용해보았습니다.
MAD 라이브러리에비해 조금 느리기는 하지만 사용 방법이 상당히 쉬운 편이어서 어렵지 않게 적용할 수 있었습니다.
JLayer가 적용된 ringdroid는 https://github.com/wkpark/ringdroid master 브렌치에 적용하였습니다.
다음은 JLayer가 적용된 소스코드의 일부입니다.
(MAD 라이브러리와 비교했을때, JLayer는 상당히 느린편이네요)
... mFileSize = (int)mInputFile.length(); FileInputStream stream = new FileInputStream(mInputFile); Decoder decoder = new Decoder(); Bitstream bitstream = new Bitstream(stream); int pos = 0; int gain = 0; try { Header header = bitstream.readFrame(); int nChannel = (header.mode() == Header.SINGLE_CHANNEL) ? 1 : 2; mGlobalChannels = nChannel; mLayer = header.layer(); mVersion = header.version(); while (true) { if (mProgressListener != null) { boolean keepGoing = mProgressListener.reportProgress( pos * 1.0 / mFileSize); if (!keepGoing) { break; } } SampleBuffer frame = (SampleBuffer) decoder.decodeFrame(header, bitstream); short[] pcm = frame.getBuffer(); bitstream.closeFrame(); double sum = 0.0f; int k = 0; int tmp; Log.d(TAG, "pcm length = " + frame.getBufferLength()); for (int j = 0; j < frame.getBufferLength(); j++) { tmp = pcm[k] > 0 ? pcm[k] : -pcm[k]; sum += tmp / 32767.0f; k += nChannel; } gain = (int) (sum / frame.getBufferLength() * 255); ...