Mam aplikację, w której korzystam z trybu AudioTrack
w trybie strumieniowym, aby odtwarzać dynamicznie generowany dźwięk. Aplikacja nie musi natychmiast reagować na dane wejściowe, więc problemy z opóźnieniami nie przeszkadzają mi po tej stronie programu.Jak określić opóźnienie dźwięku (ścieżka dźwiękowa) w systemie Android?
Problem polega na tym, że mam animację, która musi być tak dokładnie „in-sync” jak to możliwe, z dźwiękiem i wydaje się, że różne urządzenia mają różne ilości czasu od kiedy AudioTrack
przystanki blokowanie połączeń write()
i prosi więcej danych i kiedy dźwięk jest odtwarzany z głośnika.
Moje obecne rozwiązanie daje mi najwięcej do zrobienia - Liczę liczbę ramek, które dotychczas przekazałem do AudioTrack
i porównuję je z getPlaybackHeadPosition()
. To wygląda w zasadzie jak:
long currentTimeInFrames = 0;
while(playingAudio) {
currentTimeInFrames += numberOfFramesToWrite;
long delayInFrames = (currentTimeInFrames - audioTrack.getPlaybackHeadPosition());
audioTrack.write(frameBuffer,0,sampleSize);
doAnimationAfterDelay(delayInFrames);
}
Istnieje jednak jeszcze pewne opóźnienie, które getPlaybackHeadPosition()
nie wydaje się stanowić, że różni się od urządzenia.
Czy istnieje sposób na odpytanie systemu o opóźnienie ścieżki dźwiękowej?
Należy zauważyć, że na niektórych urządzeniach zgłasza 'MethodNotFoundException' – zella