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 erInFrames = bData.length / m_out_buf_size1;
m_out_trk1.setPositionNotificationPeriod(1);
m_out_trk1.setNotificationMarkerPosition(Math.max(erInFrames-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 的播放已经结束了呢?

解决方案 »

  1.   

    如果是MediaPlayer,可以设置播放完成的监听
    setOnCompletionListener
    查查文档里AudioTrack有没有监听播放完成的接口
      

  2.   

    回复 #1,AudioTrack 查找到的资料就是说应该使用 setPlaybackPositionUpdateListener 和 setNotificationMarkerPosition
      

  3.   

    setPlaybackPositionUpdateListener可以的,就是播放玩了多久调下回调函数。通常这个因为sampleRate等都是固定的,你算好就可以了。
      

  4.   

    应该有相应的EOS事件传递到上层,JAVA层可以在listner里不捕获到这个消息
      

  5.   

    只有C++的例子~ 这个不难的,如果有源码的话,在AudioTrack.java/.cpp加点trace调试下看看怎么回事
      

  6.   

    没有 android 的源代码,从哪里下载啊。
      

  7.   

    看來也有別人有這問題
    http://code.google.com/p/android/issues/detail?id=2563
      

  8.   

    我猜可能是这样:必须用MODE_STATIC模式
    setNotificationMarkerPosition
    必须放在write前面!帧数也要减去1才行,或者你把帧数除以二,应该可以回调成功而且MODE_STATIC模式在安卓4.2下问题好多,太晕了
    用MODE_STREAM模式,用不知道能不能回调成功