2014-02-15 5 views
2

Я работаю над приложением 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?

ответ

1

Вы пытались синхронизировать функции декодирования и audioTrack.write, чтобы увидеть, что удерживает вашу задачу Async? Я бы не подумал, что проблема с audioTrack.write будет проблемой.

Мой опыт работы с JLayer заключается в том, что он может быть слишком медленным для декодирования в реальном времени, особенно если вы работаете с аудио качеством CD (стерео, частотой дискретизации 44,1 кГц).

Если вы можете поднять базовый SDK, Media Codec может быть хорошим способом пойти: http://developer.android.com/reference/android/media/MediaCodec.html

Вы также можете посмотреть на реализацию аудио с помощью openSL эс. Эта статья посвящена некоторым вызовам и решениям для программирования звука на Android: Android audio programming nightmare - soundpool, audiotrack arrghh?

+0

Я согласен с SpinalTapFan11. Попробуйте синхронизировать свой метод декодирования JLayer. Я работаю с JLayer и AudioTrack в данный момент, и две вещи работают для меня гладко. 1) Держите ваши вызовы декодирования близко к минимальному размеру буфера AudioTrack. 2) Двойной буфер вашего декодированного звука (сохранить второй декодированный буфер, подготовленный для записи и замены их/повторить после записи). Если вы отмените декодирование на том же цикле async, что и на вашей записи, ваш код становится более сложным, но вы можете сохранить несколько минимальных размеров буфера для вашей следующей записи. – timmyl