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 的播放已经结束了呢?
setOnCompletionListener
查查文档里AudioTrack有没有监听播放完成的接口
http://code.google.com/p/android/issues/detail?id=2563
setNotificationMarkerPosition
必须放在write前面!帧数也要减去1才行,或者你把帧数除以二,应该可以回调成功而且MODE_STATIC模式在安卓4.2下问题好多,太晕了
用MODE_STREAM模式,用不知道能不能回调成功