저는 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를 올바르게 전달하는 가장 좋은 방법은 무엇입니까?
나는 SpinalTapFan11에 동의합니다. JLayer 디코드 메소드의 타이밍을 시험해보십시오. 현재 JLayer와 AudioTrack을 사용하고 있으며 두 가지가 원활하게 작동합니다. 1) 디코딩 호출을 AudioTrack 최소 버퍼 크기에 가깝게 유지하십시오. 2) 디코딩 된 오디오를 이중 버퍼링합니다 (쓰기 위해 준비된 두 번째 디코딩 된 버퍼를 유지하고 쓰기 후에 스왑/반복). 동일한 비동기 루프에서 작성한 코드를 디코드하는 경우 코드가 복잡해 지지만 다음 번 쓰기에 필요한 최소 버퍼 크기를 몇 배로 유지할 수 있습니다. – timmyl