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

Я пытаюсь понять, как я буду использовать буфер с AudioTrack эффективно передавать музыку. Я знаю, что вы можете поставить аудио в очередь с помощью написать метод, но как только звук поставлен в очередь, как вы скажете, сколько осталось против того, сколько было использовано/сыграно? Извините, если это элементарный вопрос. Я понимаю концепцию буфера, я просто не уверен, как его написать, особенно с помощью AudioTrack.

2 ответов


AudioTrack.написать () возвращает" количество байтов, записанных " как int, и вы указываете количество байтов в буфере при построении AudioTrack.

поэтому, чтобы отслеживать, сколько буферного пространства остается, Вы можете сохранить переменную аккумулятора, чтобы знать, сколько байтов было записано в общей сложности, и установить эту переменную в ноль при вызове AudioTrack.flush (). Однако в связанной документации говорится: "типично использовать куски 1/2 общего размера, чтобы разрешить двойную буферизацию", поэтому может быть достаточно просто просто вспомнить, если вы написали ноль, один или два раза с момента вызова flush.

чтобы узнать, сколько буфера было воспроизведено, используйте AudioTrack.getPlaybackHeadPosition () который возвращает число кадры, которые были сыграны текущего буфера (т. е. сброс до нуля при остановке, сбросе или перезагрузке)как 32-разрядное целое число со знаком но интерпретируется как 32-разрядное целое число без знака. Все это действительно означает, что вы назначаете его int следующим образом.

int bufferPlaybackFrame = myAudioTrack.getPlaybackHeadPosition() & 0xFF;

вы можете думать о кадрах как эквивалентных образцам. т. е. вы можете вычислить из AudioFormat, используемого для построения AudioTrack, сколько битов (и, следовательно, байтов) используется в выборке.

наконец, если кому-то было интересно, вы никогда не сможете сказать, сколько исходного файла или потока осталось для воспроизведения через этот объект (одна из причин заключается в том, что он предназначен для работы с постоянными потоками 24/7, без конца), поэтому, если вы хотите сделать расчет, как вы видите на некоторых веб-сайтах воспроизведения видео, которые приостанавливают поток до тех пор, пока не будет достаточно ID буферизован, чтобы увидеть все видео при текущей скорости загрузки, вам придется передать эту информацию каким-то другим способом.


*этот код поможет воспроизводить аудио с буфером*

  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 ");
     }