Я работаю над приложением Android, которое использует библиотеку JLayer для декодирования MP3-файла (мне нужен доступ к аудио-образцам) и объекта 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 = 5000 мс). Как я вижу, audioTrack.write (...) блокирует мою задачу async, поэтому короткая пауза после каждого шага вызвана ожиданием результата из метода декодирования.
Есть ли у вас какие-либо советы, что лучше всего подходит для доставки outSignalBuffer для записи метода с декодера, чтобы получить плавный проигрыватель audioTrack?
Я согласен с SpinalTapFan11. Попробуйте синхронизировать свой метод декодирования JLayer. Я работаю с JLayer и AudioTrack в данный момент, и две вещи работают для меня гладко. 1) Держите ваши вызовы декодирования близко к минимальному размеру буфера AudioTrack. 2) Двойной буфер вашего декодированного звука (сохранить второй декодированный буфер, подготовленный для записи и замены их/повторить после записи). Если вы отмените декодирование на том же цикле async, что и на вашей записи, ваш код становится более сложным, но вы можете сохранить несколько минимальных размеров буфера для вашей следующей записи. – timmyl