В настоящее время я пытаюсь воспроизвести звук с помощью AudioTrack. Аудио принимается по сети, и приложение постоянно считывает данные и добавляет их во внутренний буфер. Отдельный поток потребляет данные и использует AudioTrack для воспроизведения.
Проблемы:
- Воспроизведение звука колеблется (ощущение, что звук пропадает через регулярные промежутки времени), постоянно делая его нечетким.
- Скорость воспроизведения слишком высока или слишком низка, что делает их нереалистичными.
Чтобы избежать задержки в сети и других факторов, я заставил приложение ждать, пока оно не прочитает достаточно данных и не воспроизведет их в конце.
Это заставляет звук воспроизводиться очень быстро. Вот базовый пример логики, которую я использую.
sampleRate = AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_MUSIC);
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
AudioFormat.CHANNEL_OUT_STEREO,
AudioFormat.ENCODING_PCM_16BIT,
AudioTrack.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT),
AudioTrack.MODE_STREAM);
audioTrack.play();
short shortBuffer[] = new short[AudioTrack.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT)];
while (!stopRequested){
readData(shortBuffer);
audioTrack.write(shortBuffer, 0, shortBuffer.length, AudioTrack.WRITE_BLOCKING);
}
Правильно ли сказать, что класс Android AudiTrack не имеет встроенных функций для управления воспроизведением звука в зависимости от условий окружающей среды? Если да, есть ли лучшие библиотеки с упрощенным способом воспроизведения звука?