Tôi có một ứng dụng mà tôi sử dụng chế độ phát trực tuyến AudioTrack
để phát âm thanh được tạo động. Ứng dụng không phải trả lời tức thời các đầu vào, do đó, các vấn đề về độ trễ không làm phiền tôi cho phía đó của chương trình.Làm cách nào để xác định độ trễ âm thanh (AudioTrack) trên Android?
Vấn đề là tôi có hoạt ảnh cần phải chính xác 'đồng bộ' càng tốt với âm thanh và có vẻ như các thiết bị khác nhau có lượng thời gian khác nhau giữa thời điểm khi AudioTrack
dừng chặn cuộc gọi write()
và yêu cầu để biết thêm dữ liệu và khi âm thanh đó được phát từ loa.
Giải pháp hiện tại của tôi mang lại cho tôi hầu hết cách đó - Tôi đếm số khung hình mà tôi đã chuyển đến số AudioTrack
cho đến nay và so sánh nó với getPlaybackHeadPosition()
. Về cơ bản, nó trông giống như:
long currentTimeInFrames = 0;
while(playingAudio) {
currentTimeInFrames += numberOfFramesToWrite;
long delayInFrames = (currentTimeInFrames - audioTrack.getPlaybackHeadPosition());
audioTrack.write(frameBuffer,0,sampleSize);
doAnimationAfterDelay(delayInFrames);
}
Tuy nhiên, vẫn còn một số độ trễ mà getPlaybackHeadPosition()
dường như không tính đến điều đó thay đổi theo thiết bị.
Có cách nào để thăm dò ý kiến hệ thống về độ trễ của AudioTrack không?
Lưu ý rằng trên một số thiết bị sẽ phát 'MethodNotFoundException' – zella