Я частично решил это, поместив mPlayer.write(audio, 0, audio.length);
в его собственное Thread
.Это устраняет некоторую нестабильность (из-за того, что запись является блокирующим вызовом), но по-прежнему звучит прерывисто после хорошей секунды или 2. У него все еще значительная задержка 2-3 секунды.
new Thread(){
public void run(){
byte[] audio = packet.getData();
mPlayer.write(audio, 0, audio.length);
}
}.start();
Просто маленький аноним Thread
, который пишет сейчас ...
У кого-нибудь есть идеи, как решить эту проблему?
Редактировать:
После некоторых дополнительных проверок и отладки я заметил, что это проблема с receiveBuffer.Я посмотрел на код Java AudioTrack и C ++ код AudioTrack И заметил, что он может появиться только в коде C ++.
if (__builtin_expect(result!=NO_ERROR, false)) {
LOGW( "obtainBuffer timed out (is the CPU pegged?) "
"user=%08x, server=%08x", u, s);
mAudioTrack->start(); // FIXME: Wake up audioflinger
timeout = 1;
}
Я заметил, что в этом фрагменте кода есть FIXME
.: <Но в любом случае, кто-нибудь может объяснить, как работает этот код C ++?У меня был некоторый опыт работы с ним, но он никогда не был таким сложным, как этот ... </p>
Редактировать 2:
Я пробовал несколько иначе, разница в том, чтоЯ буферизирую данные, которые я получаю, и затем, когда буфер заполняется некоторыми данными, они записываются в проигрыватель.Тем не менее, игрок продолжает потреблять в течение нескольких циклов, затем срабатывает предупреждение obtainBuffer timed out (is the CPU pegged?)
, и игроку вообще ничего не записывается до тех пор, пока его удар не вернется к жизни ... После этого он будет постояннополучить данные, записанные в него, пока буфер не будет очищен.
Еще одно небольшое отличие состоит в том, что я сейчас направляю файл на проигрыватель.То есть, читая его порциями, записывая эти порции в буфер.Это имитирует получение пакетов по Wi-Fi ...
Я начинаю задумываться, не является ли это просто проблемой ОС, которая есть у Android, и это не то, что я могу решить самостоятельно ... Кто-нибудь получилесть какие-нибудь идеи по этому поводу?
Редактировать 3:
Я провел больше испытаний, но это мне больше не помогает.Этот тест показывает, что у меня возникает задержка только при первой попытке записи в AudioTrack.Это займет от 1 до 3 секунд.Я сделал это, используя следующий бит кода:
long beforeTime = Utilities.getCurrentTimeMillis(), afterTime = 0;
mPlayer.write(data, 0, data.length);
afterTime = Utilities.getCurrentTimeMillis();
Log.e("WriteToPlayerThread", "Writing a package took " + (afterTime - beforeTime) + " milliseconds");
Тем не менее, я получаю следующие результаты: Logcat Image http://img810.imageshack.us/img810/3453/logcatimage.png
Они показывают, что отставание изначально происходит в начале,после чего AudioTrack продолжает непрерывно получать данные ... Мне действительно нужно исправить это ...