Использование буфера с Android AudioTrack

Я пытаюсь понять, как использовать буфер с AudioTrack для эффективного потока музыки. Я знаю, что вы можете поставить в очередь аудио, используя метод write, но как только звук поставлен в очередь, как вы скажете, сколько осталось, сколько были использованы/сыграны? Извините, если это рудиментарный вопрос. Я понимаю концепцию буфера, я просто не уверен, как писать, особенно используя 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 ");
     }