AudioTrack 如何才能知道已经播放结束了

lazy_2010 2011-01-18 04:44:02

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 的播放已经结束了呢?
...全文
2182 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我猜可能是这样:必须用MODE_STATIC模式 setNotificationMarkerPosition 必须放在write前面!帧数也要减去1才行,或者你把帧数除以二,应该可以回调成功 而且MODE_STATIC模式在安卓4.2下问题好多,太晕了 用MODE_STREAM模式,用不知道能不能回调成功
LCamel2 2011-02-18
  • 打赏
  • 举报
回复
看來也有別人有這問題
http://code.google.com/p/android/issues/detail?id=2563
zhuzeitou 2011-01-20
  • 打赏
  • 举报
回复
http://android.git.kernel.org/
lazy_2010 2011-01-20
  • 打赏
  • 举报
回复
没有 android 的源代码,从哪里下载啊。
lazy_2010 2011-01-20
  • 打赏
  • 举报
回复
好吧,假定大家都懂,可是就是没把我教明白,唉。
freshui 2011-01-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lazy_2010 的回复:]
引用 4 楼 freshui 的回复:
setPlaybackPositionUpdateListener可以的,就是播放玩了多久调下回调函数。通常这个因为sampleRate等都是固定的,你算好就可以了。


你有例子代码么?我的代码怎么总是回调函数不能被调用。
[/Quote]
只有C++的例子~ 这个不难的,如果有源码的话,在AudioTrack.java/.cpp加点trace调试下看看怎么回事
CyberLogix 2011-01-19
  • 打赏
  • 举报
回复
应该有相应的EOS事件传递到上层,JAVA层可以在listner里不捕获到这个消息
lazy_2010 2011-01-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 freshui 的回复:]
setPlaybackPositionUpdateListener可以的,就是播放玩了多久调下回调函数。通常这个因为sampleRate等都是固定的,你算好就可以了。
[/Quote]

你有例子代码么?我的代码怎么总是回调函数不能被调用。
freshui 2011-01-18
  • 打赏
  • 举报
回复
setPlaybackPositionUpdateListener可以的,就是播放玩了多久调下回调函数。通常这个因为sampleRate等都是固定的,你算好就可以了。
ameyume 2011-01-18
  • 打赏
  • 举报
回复
另外,如果可以取得当前播放的时间和总时间,做个比较,相差一定时间(例如1s)之内就认为播放完了.
lazy_2010 2011-01-18
  • 打赏
  • 举报
回复
回复 #1,AudioTrack 查找到的资料就是说应该使用 setPlaybackPositionUpdateListener 和 setNotificationMarkerPosition
ameyume 2011-01-18
  • 打赏
  • 举报
回复
如果是MediaPlayer,可以设置播放完成的监听
setOnCompletionListener
查查文档里AudioTrack有没有监听播放完成的接口

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧