Я пытаюсь понять, как использовать буфер с AudioTrack для эффективного потока музыки. Я знаю, что вы можете поставить в очередь аудио, используя метод write, но как только звук поставлен в очередь, как вы скажете, сколько осталось, сколько были использованы/сыграны? Извините, если это рудиментарный вопрос. Я понимаю концепцию буфера, я просто не уверен, как писать, особенно используя AudioTrack.
Использование буфера с Android AudioTrack
Ответ 1
AudioTrack.write() возвращает "количество байтов, записанных" как int, и вы определяете количество байтов в буфере при построении AudioTrack.
Таким образом, чтобы отслеживать, сколько буферного пространства осталось, вы можете сохранить переменную аккумулятора, чтобы вы знали, сколько байтов было записано в общей сложности, и установите эту переменную равной нулю, когда вы вызываете AudioTrack.flush(). Однако связанная документация гласит, что "типично использовать куски 1/2 от общего размера, чтобы разрешить двойную буферизацию", поэтому может быть достаточно просто запомнить, если вы написали нуль один или два раза с момента вызова flush.
Чтобы узнать, сколько из буфера было воспроизведено, используйте AudioTrack.getPlaybackHeadPosition(), который возвращает количество фреймов, которые были текущего буфера (т.е. reset до нуля при остановке, сбросе или перезагрузке) в качестве подписанного 32-битного целого, но для интерпретации как unsigned 32 -битное целое число. Все это на самом деле означает, что вы назначаете его int следующим образом.
int bufferPlaybackFrame = myAudioTrack.getPlaybackHeadPosition() & 0xFF;
Вы можете думать о кадрах как эквивалентных образцам. т.е. вы можете работать с AudioFormat, используемым для построения AudioTrack, сколько бит (и, следовательно, байтов) используется для каждого образца.
Наконец, на случай, если кто-то задается вопросом, вы никогда не сможете сказать, сколько исходного файла или потока осталось играть через этот объект (одна из причин, по которой он предназначен для работы с постоянными 24/7 потоками, с без конца), поэтому, если вы хотите сделать расчет, как вы видите на некоторых видеоиграх на веб-сайтах, которые приостанавливают поток до тех пор, пока достаточное количество буферизированных буферов для просмотра всего видео в вашей текущей скорости загрузки, вам придется передать эту информацию в некоторых другой путь.
Ответ 2
* Этот код поможет воспроизводить аудио с буфером *
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 ");
}