AudioTrack でバッファを使用して、音楽を効果的にストリーミングする方法を理解しようとしています。 write メソッドを使用してオーディオをキューに入れることができることは知っていますが、オーディオがキューに入れられたら、残りの量と使用/再生された量をどのように判断しますか?これが初歩的な質問である場合は申し訳ありません。バッファの概念を理解しています。特にAudioTrackを使用して、バッファを作成する方法がわかりません。
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がバッファリングされるまでストリームを一時停止する場合は、他の方法でその情報を渡す必要があります。
* このコードは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 ");
}