web-dev-qa-db-ja.com

Android AudioTrackでバッファを使用する

AudioTrack でバッファを使用して、音楽を効果的にストリーミングする方法を理解しようとしています。 write メソッドを使用してオーディオをキューに入れることができることは知っていますが、オーディオがキューに入れられたら、残りの量と使用/再生された量をどのように判断しますか?これが初歩的な質問である場合は申し訳ありません。バッファの概念を理解しています。特にAudioTrackを使用して、バッファを作成する方法がわかりません。

11
William Seemann

AudioTrack.write() は「書き込まれたバイト数」をintとして返し、AudioTrackを構築するときにバッファ内のバイト数を指定します。

したがって、残りのバッファスペースの量を追跡するには、アキュムレータ変数を保持して、合計で何バイトが書き込まれたかを把握し、 AudioTrack.flush() を呼び出すたびにこの変数をゼロに設定します。ただし、リンクされたドキュメントには、「ダブルバッファリングを許可するために、合計サイズの1/2のチャンクを使用するのが一般的です」と記載されているため、flushを呼び出してから1回または2回、ゼロを書き込んだかどうかを簡単に覚えておくことができます。 。

再生されたバッファの量を確認するには、 AudioTrack.getPlaybackHeadPosition() を使用します。これは、再生されたフレームの数を返します現在のバッファの(つまり、停止、フラッシュ、またはリロード時にゼロにリセット)符号付き32ビット整数として、ただし符号なし32ビット整数。これは本当に、次のようにintに割り当てることを意味します。

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

フレームはサンプルと同等と考えることができます。つまり、AudioTrackを構築するために使用されるAudioFormatから、サンプルごとに使用されているビット数(したがってバイト数)を計算できます。

最後に、誰かが疑問に思っていた場合、このオブジェクトを介して再生するために残っているソースファイルまたはストリームの量を知ることはできません(1つの理由は、24時間年中無休の永続的なストリームで動作するように設計されているためです)したがって、一部のビデオ再生Webサイトで見られるような計算を行い、現在のダウンロードレートでビデオ全体を表示するのに十分なIDがバッファリングされるまでストリームを一時停止する場合は、他の方法でその情報を渡す必要があります。

16
Andrew Martin

* このコードはbuffer*でオーディオを再生するのに役立ちます

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