播放

2016-07-10 53 views
0

的整個時期的Android AudioTrack寫入塊我使用AudioTrack課堂上播放原始聲音數據流:在一個單獨的線程播放

AudioTrack audioTrack; 
int sampleRate = 11025; 
int channelConfigIn = AudioFormat.CHANNEL_IN_MONO; 
int channelConfigOut = AudioFormat.CHANNEL_OUT_STEREO; 
int audioFormat = AudioFormat.ENCODING_PCM_16BIT; 
..... 
int bufferSize = AudioTrack.getMinBufferSize(sampleRate,channelConfigOut,audioFormat); 
audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,sampleRate,channelConfigOut,audioFormat,bufferSize,AudioTrack.MODE_STREAM); 
    audioTrack.play(); 

然後:

while(true) 
{ 
    short [] buffer = new short[14500]; 
    //fill buffer with sound data 
    long time = System.currentTimeMillis(); 
    audioTrack.write(buffer,0,14500); 
    Log.i("time",(System.currentTimeMillis() - time) + ""); 
} 

我的問題是該日誌總是顯示write方法阻塞約0.6秒,這與播放聲音長度(14500個樣本)相同,而且在回放期間電話沒有響應,主要步驟幾乎無法做任何人都可以幫助的事情...

+1

[this](http://pastebin.com/tz2Mvh5G)正常工作正常 – pskink

回答

0

您正在使用write()方法的阻止版本。您可以改爲使用write(float[],int,int,int),並將WRITE_NON_BLOCKING作爲第四個參數傳遞,但這隻會寫入儘可能多的數據,因爲它們可以放入播放緩衝區中。我通常更喜歡你已有的方法(專門寫一篇文章)。您應該期望每個電話被阻止;畢竟,播放緩衝區只能容納這麼多的數據,並且爲了騰出更多的空間,必須播放聲音(這需要時間)。 14500個採樣是以您選擇的採樣率〜1.3秒的聲音,所以我猜測每次需要大約.7秒來填充buffer

基於提供的代碼,我無法判斷爲什麼你的UI線程沒有響應。

+0

感謝您的迴應,首先您建議的方法需要apk 23,所以我沒有使用它,雖然我知道它存在,第二我做了使用'HandlerThread'來解決它,線程的優先級似乎是它的原因。無論如何,似乎有一個累積的延遲,導致回放遲到一點,隨着時間的推移 – ammcom