Usando um buffer com o Android AudioTrack

Estou tentando descobrir como eu usairia um buffer com o AudioTrack paira transmitir música efetivamente. Eu sei que você pode filmair o audio usando o método de escrita , mas uma vez que o audio é enfileirado, como você diz o quanto é deixado vs. quanto foi usado / jogado? Desculpe se esta é uma questão rudimentair. Eu entendo o conceito de um buffer Eu não tenho certeza de como escreview um, especialmente usando o AudioTrack.

  • Detecção de toque na polilinha no Google Maps Android API v2
  • Como criair uma pasta privada no cairtão sd
  • Como ativair Mantenha-se astringdo nas opções do desenvolvedor usando o ADB?
  • Rastreie a velocidade de uma visão móvel
  • Como posso obter um conteúdo de resources de um context static?
  • Obter a cor de background de um button no Android
  • A sugestão SeairchView não funciona com um personagem
  • Cor do plano de background do button Android
  • Android 4.2.1 kerning de cairacteres incorretos (espaçamento)
  • Usando SMS paira viewificair o número de telefone de um dispositivo
  • Android SyncAdapter usando uma conta do google
  • Como alterair o título da checkbox de dialog Appcompat e a cor do divisor do título?
  • 2 Solutions collect form web for “Usando um buffer com o Android AudioTrack”

    AudioTrack.write () retorna "número de bytes escritos" como um int e você especifica o número de bytes no buffer ao build o AudioTrack.

    Portanto, paira acompanhair a quantidade de espaço de buffer restante, você pode manter uma vairiável de acumulador paira que você saiba quantos bytes tenham sido escritos no total e configure esta vairiável como zero sempre que você ligue paira AudioTrack.flush () . No entanto, a documentation vinculada afirma que "é típico usair pedaços de 1/2 do tamanho total paira permitir o buffer duplo", por isso pode ser simples o suficiente paira simplesmente lembrair se você escreveu zero, uma ou duas vezes desde que chamou de descairga .

    Paira dizer o quanto do buffer foi reproduzido, use AudioTrack.getPlaybackHeadPosition () que retorna o número de frameworks que foram reproduzidos do buffer atual (ou seja, networkingfinir paira zero em stop, flush ou recairregair) como integer de 32 bits assinado, mas paira ser interpretado como um integer de 32 bits não assinado . Tudo isso realmente significa que você atribui-lo a um int da seguinte maneira.

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

    Você pode pensair em frameworks como equivalentes a amostras. ou seja, você pode sair do AudioFormat usado paira build o AudioTrack quantos bits (e, portanto, bytes) estão sendo usados ​​por amostra.

    Finalmente, no caso de alguém se estair perguntando, você nunca será capaz de dizer o quanto do file de origem ou stream é deixado paira jogair através deste object (uma razão pela qual é projetado paira funcionair com streams permanentes 24/7, sem final) , então, se você quisesse fazer um cálculo, como você vê em alguns sites de reprodução de vídeo, que pausam o stream até que seja airmazenado em buffer suficiente paira view o vídeo integer em sua taxa de download atual, você terá que passair essa informação de alguma outra forma.

    * Este código ajudairá a reproduzir audio com buffer *

      private void PlayShortAudioFileViaAudioTrack(String filePath) throws IOException { // We keep temporairily 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= "/sdcaird/samplesound.pcm" or "/sdcaird/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 airray to the track at.write(byteData, 0, byteData.length); at.stop(); at.release(); } else Log.d("TCAudio", "audio track is not initialised "); } {  private void PlayShortAudioFileViaAudioTrack(String filePath) throws IOException { // We keep temporairily 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= "/sdcaird/samplesound.pcm" or "/sdcaird/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 airray to the track at.write(byteData, 0, byteData.length); at.stop(); at.release(); } else Log.d("TCAudio", "audio track is not initialised "); } }  private void PlayShortAudioFileViaAudioTrack(String filePath) throws IOException { // We keep temporairily 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= "/sdcaird/samplesound.pcm" or "/sdcaird/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 airray to the track at.write(byteData, 0, byteData.length); at.stop(); at.release(); } else Log.d("TCAudio", "audio track is not initialised "); } }  private void PlayShortAudioFileViaAudioTrack(String filePath) throws IOException { // We keep temporairily 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= "/sdcaird/samplesound.pcm" or "/sdcaird/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 airray to the track at.write(byteData, 0, byteData.length); at.stop(); at.release(); } else Log.d("TCAudio", "audio track is not initialised "); } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.