2014-02-15 7 views
2

저는 MP3 파일을 디코딩하기 위해 JLayer 라이브러리를 사용하는 안드로이드 어플리케이션 (오디오 샘플에 액세스해야합니다)과 AudioTrack 오브젝트를 재생하고 있습니다.AudioTrack을 JLayer 디코더와 함께 사용하십시오.

int timeMarker = 0; 
int timeStep = 5000; 

while (!isCancelled()) { 
    outSignalBuffer = decode(fileToPlay.getPath(), timeMarker, timeStep, bufferSize); 
    audioTrack.write(outSignalBuffer, 0, outSignalBuffer.length); 
    //publishProgress(outSignalBuffer); 
    timeMarker += timeStep; 
} 

이 코드는 AsyncTask를로 만들어 내 사용자 정의 플레이어에 배치됩니다 :이 같은 있습니다. 일반적으로 사운드 파일을 듣기 때문에 내 디코드 및 쓰기 메서드가 제대로 작동합니다. 문제는 매 5 초마다 내 소리가 규칙적으로 울리는 것입니다 (timeStep = 5000ms). audioTrack.write (...)가 내 비동기 작업을 차단하므로 매 단계마다 짧은 일시 중지는 decode 메서드의 결과를 기다리면서 발생합니다.

원활한 audioTrack 플레이어를 얻기 위해 디코더에서 메서드를 작성하기 위해 outSignalBuffer를 올바르게 전달하는 가장 좋은 방법은 무엇입니까?

답변

1

디코드 및 audioTrack.write 기능 타이밍을 조정하여 비동기 작업을 보류하고 있는지 확인해 보셨습니까? audioTrack.write가 문제라고 생각하지 않습니다.

JLayer를 사용한 나의 경험은 특히 CD 품질의 오디오 (스테레오, 44.1kHz 샘플링 속도)로 작업하는 경우 실시간 디코딩에 너무 느릴 수 있다는 것입니다. http://developer.android.com/reference/android/media/MediaCodec.html

또한 openSL의 ES를 사용하여 오디오를 구현 볼 수 있습니다 : 당신이 당신의 기본 SDK를 제기 할 수있는 경우

는 미디어 코덱 갈 수있는 좋은 방법이 될 수 있습니다. 이 게시물은 Android 오디오 프로그래밍에 대한 몇 가지 과제와 솔루션을 다룹니다. Android audio programming nightmare - soundpool, audiotrack arrghh?

+0

나는 SpinalTapFan11에 동의합니다. JLayer 디코드 메소드의 타이밍을 시험해보십시오. 현재 JLayer와 AudioTrack을 사용하고 있으며 두 가지가 원활하게 작동합니다. 1) 디코딩 호출을 AudioTrack 최소 버퍼 크기에 가깝게 유지하십시오. 2) 디코딩 된 오디오를 이중 버퍼링합니다 (쓰기 위해 준비된 두 번째 디코딩 된 버퍼를 유지하고 쓰기 후에 스왑/반복). 동일한 비동기 루프에서 작성한 코드를 디코드하는 경우 코드가 복잡해 지지만 다음 번 쓰기에 필요한 최소 버퍼 크기를 몇 배로 유지할 수 있습니다. – timmyl