Я пытаюсь понять, как использовать буфер с AudioTrack для эффективно транслировать музыку. Я знаю, что вы можете ставить аудио в очередь, используя ссылку write, но как только звук поставлен в очередь, как узнать, сколько осталось по сравнению с тем, сколько было использовано/воспроизведено? Извините, если это элементарный вопрос. Я понимаю концепцию буфера, просто не знаю, как его написать, особенно с помощью AudioTrack.
Использование буфера с Android AudioTrack
Ответы (2)
AudioTrack.write() возвращает «количество записанных байтов» в виде целого числа, и вы указываете количество байтов в буфере при построении AudioTrack.
Поэтому, чтобы отслеживать, сколько места в буфере осталось, вы можете сохранить переменную-аккумулятор, чтобы знать, сколько всего байтов было записано, и устанавливать эту переменную в ноль всякий раз, когда вы вызываете AudioTrack.flush(). Однако в связанной документации говорится, что «типично использовать куски 1/2 от общего размера, чтобы разрешить двойную буферизацию», поэтому может быть достаточно просто просто вспомнить, написали ли вы ноль, один или два раза с момента вызова flush .
Чтобы узнать, какая часть буфера воспроизведена, используйте AudioTrack.getPlaybackHeadPosition() который возвращает количество воспроизведенных кадров текущего буфера (т.е. сбрасывается до нуля при остановке, сбросе или перезагрузке) со знаком 32- битовое целое, но интерпретируется как 32-битное целое число без знака. Все это на самом деле означает, что вы назначаете его int следующим образом.
int bufferPlaybackFrame = myAudioTrack.getPlaybackHeadPosition() & 0xFF;
Вы можете думать о фреймах как об эквивалентах сэмплов. т. е. вы можете определить из AudioFormat, используемого для создания AudioTrack, сколько битов (и, следовательно, байтов) используется для каждого семпла.
Наконец, если кому-то интересно, вы никогда не сможете сказать, сколько исходного файла или потока осталось для воспроизведения через этот объект (одна из причин заключается в том, что он предназначен для работы с постоянными потоками 24/7, без окончания) , поэтому, если вы хотите сделать расчет, как вы видите на некоторых веб-сайтах, воспроизводящих видео, которые приостанавливают поток до тех пор, пока не будет буферизовано достаточное количество идентификаторов, чтобы увидеть все видео с текущей скоростью загрузки, вам придется передать эту информацию каким-то другим способом.
*Этот код поможет воспроизводить аудио с буфером*
private void PlayShortAudioFileViaAudioTrack(String filePath) throws IOException
{
// We keep temporarily filePath globally as we have only two sample sounds now..
if (filePath==null)
return;
//Reading the file..
byte[] byteData = null;
File file = null;
file = new File(filePath);
// for ex. path= "/sdcard/samplesound.pcm" or "/sdcard/samplesound.wav"
byteData = new byte[(int) file.length()];
FileInputStream in = null;
try {
in = new FileInputStream( file );
in.read( byteData );
in.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Set and push to audio track..
int intSize = android.media.AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_8BIT);
AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_8BIT, intSize, AudioTrack.MODE_STREAM);
if (at!=null) {
at.play();
// Write the byte array to the track
at.write(byteData, 0, byteData.length);
at.stop();
at.release();
}
else
Log.d("TCAudio", "audio track is not initialised ");
}