2012-09-07 234 views
7

我正在使用音頻軌道以流模式播放不同的聲音。 我想知道是否有方法知道每個聲音的生命/結束時間。AudioTrack - 如何知道聲音何時開始/結束?

我創建的音軌是這樣的:

AudioTrack tmpAudioTrack = new AudioTrack(
     STREAM_TYPE, 
     SAMPLE_RATE, 
     CHANNEL_CONFIG_TYPE, 
      AUDIO_FORMAT_TYPE, 
     getOptimalBufferSize(), 
     AUDIO_TRACK_MODE);' 

,並在後臺線程啓動:

backround_thread = new Thread(new MyRunnable(aTrack)); 
    backround_thread.start(); 

我寫的每一個聲音這樣可運行的內部:

byte generatedSnd[] = new byte[2 * beepSamples]; 
<code for filling the buffer with sound here> 
int bytesWritten = track.write(generatedSnd, 0, generatedSnd.length); 

可以使用任何AudioTrack API,例如setNotificationMarkerPosition或setLoopPoints或se tPositionNotificationPeriod完成此任務嗎?他們是如何工作的?

每個聲音可以是不同的持續時間。我認爲這是關鍵。

我不完全理解這些API的文檔。每個框架與樣本相同嗎?如何爲每個聲音開始/結束的位置指定一個標記?

謝謝,

+0

至少有人知道setNotificationMarkerPosition和setPositionNotificationPeriod之間的區別嗎? – mikemeli

回答

12

這就是我所發現的。

對我而言,幀是樣本。這是聲音乘以採樣率的持續時間。

要使用AudioTrack setPositionNotificationPeriod,您需要傳遞一定數量的樣本。意思是如果你通過200個樣本,回調將被稱爲每200個樣本,經常性的。

tmpAudioTrack.setPositionNotificationPeriod(duration * sampleRate); 

要使用setNotificationMarkerPosition,還需要傳遞一定數量的樣本。但是,這是絕對的,並不像期間API那樣。因此,如果您想確定聲音何時結束,則傳遞樣本量(總音軌持續時間* sampleRate)。

tmpAudioTrack.setNotificationMarkerPosition(duration * sampleRate); 

但是,如果你已經打在你的聲音軌道中間,並希望添加標記,所以你將調用回讓我們比如3秒內從現在,那麼你就需要添加當前音頻軌道,這樣的播放頭:(您的持續時間爲3秒)

tmpAudioTrack.setNotificationMarkerPosition(tmpAudioTrack.getPlaybackHeadPosition() + (duration * sampleRate)); 

這就是你得到怎樣註冊期間和標記通知。

tmpAudioTrack.setPlaybackPositionUpdateListener(new OnPlaybackPositionUpdateListener(){ 

    @Override 
    public void onMarkerReached(AudioTrack arg0) { 

    } 

    @Override 
    public void onPeriodicNotification(AudioTrack arg0) { 

    } 

});