当前位置: 代码迷 >> Android >> AudioTrack 怎么才能知道已经播放结束了
  详细解决方案

AudioTrack 怎么才能知道已经播放结束了

热度:42   发布时间:2016-04-28 07:54:20.0
AudioTrack 如何才能知道已经播放结束了

        m_out_buf_size1 = android.media.AudioTrack.getMinBufferSize(16000,   
               AudioFormat.CHANNEL_CONFIGURATION_MONO,
               AudioFormat.ENCODING_PCM_16BIT);
        m_out_trk1 = new AudioTrack(AudioManager.STREAM_MUSIC, 16000,   
                         AudioFormat.CHANNEL_CONFIGURATION_MONO, 
                         AudioFormat.ENCODING_PCM_16BIT,
                         Math.max(m_out_buf_size1*3, 10240),
                         AudioTrack.MODE_STREAM);
         byte[] bData = ...; // 这里获取需要播放的数据
int offset = 0;
int markerInFrames = bData.length / m_out_buf_size1;
m_out_trk1.setPositionNotificationPeriod(1);
m_out_trk1.setNotificationMarkerPosition(Math.max(markerInFrames-1, 0));
m_out_trk1.setPlaybackPositionUpdateListener(this);
         // 调用 m_out_trk1.write/.play/.stop
         ...

         // 然后,实现如下代码,却发现声音正常输出了,却没有输出 onMarkerReached 字符串,问题在哪里?
@Override
public void onMarkerReached(AudioTrack track) {
// TODO Auto-generated method stub
Log.d(TAG, "onMarkerReached");
}

@Override
public void onPeriodicNotification(AudioTrack track) {
// TODO Auto-generated method stub
Log.d(TAG, "onPeriodicNotification");
}



找了找资料,有很多说 AudioTrack 的实现存在问题,不明白该如何才能知道 AudioTrack 的播放已经结束了呢?

------解决方案--------------------
另外,如果可以取得当前播放的时间和总时间,做个比较,相差一定时间(例如1s)之内就认为播放完了.
------解决方案--------------------
setPlaybackPositionUpdateListener可以的,就是播放玩了多久调下回调函数。通常这个因为sampleRate等都是固定的,你算好就可以了。
------解决方案--------------------
应该有相应的EOS事件传递到上层,JAVA层可以在listner里不捕获到这个消息
------解决方案--------------------
http://android.git.kernel.org/