在AudioTrack中,声音结束的检测可以通过使用一个计时器来实现。在音频播放过程中,每当音频数据被播放时,计时器就会被重置。如果音频播放完毕,即所有数据都已播放完毕,计时器就会达到预设的时间,此时可以认为声音已经结束。
以下是一个示例代码,用于检测AudioTrack中声音的结束:
const int SAMPLE_RATE = 44100;
const int BUFFER_SIZE = 8192;
AudioTrack audioTrack;
short[] audioData = new short[BUFFER_SIZE];
void setup() {
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLE_RATE, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, BUFFER_SIZE);
audioTrack.setVolume(1.0f);
audioTrack.setLoopPoints(0, BUFFER_SIZE / 2, (short) (SAMPLE_RATE * 1000));
}
void loop() {
audioTrack.write(audioData, 0, BUFFER_SIZE);
if (audioTrack.getPlayState() == AudioTrack.PLAYSTATE_STOPPED) {
// 声音已停止播放,可以认为声音已结束
// 在这里执行声音结束后的操作
}
}
在上面的代码中,我们创建了一个AudioTrack对象,并使用setLoopPoints方法设置了一个循环点,该循环点从音频数据的开始处开始,以BUFFER_SIZE / 2大小的数据进行循环。在循环中,我们使用write方法将音频数据写入AudioTrack对象中。
当AudioTrack对象的playState变为STOPPED时,即音频播放已停止,可以认为声音已经结束。此时我们可以执行一些声音结束后的操作,例如播放音效或者进行其他一些操作。
上一期刚刚掀完桌子没多久《Android MP3录制,波形显示,音频权限兼容与播放》,就有小伙伴问我:“一个音频的网络地址,如何根据这个获取它的波形图?”··· WTF(ノಠ益ಠ)ノ彡┻━┻,那一瞬间那是热泪盈眶啊,为什么我就没想到呢···反正肯定不是为了再水一篇文章就对了<( ̄︶ ̄)>。
我是DEMO领取专属 10元无门槛券
手把手带您无忧上云