感谢迈克的回答。但不幸的是,这对我没有帮助。
假设我让 MediaPlayer 在 00:00 开始播放长度为 3:45 的歌曲。
在 01:00,我开始使用手机的资源,由于使用量很大,我的手机出现故障,导致 MediaPlayer 暂停 2 秒。
时间:
00:00-01:00 -我在 00:00-01:00 听到了音频
01:00-01:02 -我听到了静音,因为电话出现故障
01:02-03:47 -我在 01 听到了音频: 00-03:45 with 2 second time skew
现在据我了解,MediaPlayer 在这个问题域上是一个不好的使用选择,因为MediaPlayer
它提供了一个高级 API。
我目前正在尝试
AudioTrack
应该为我提供所需内容的课程:
//Creating a new audio track
AudioTrack audioTrack = new AudioTrack(...)
//Get start time
long start = System.currentTimeMillis();
// loop until finished
for (...) {
// Get time in song
long now = System.currentTimeMillis();
long nowInSong = now - start;
// get a buffer from the song at time nowInSong with a length of 1 second
byte[] b = getAudioBuffer(nowInSong);
// play 1 second of music
audioTrack.write(b, 0, b.length);
// remove any unplayed data
audioTrack.flush();
}
现在,如果我出现故障,我只会出现 1 秒钟的故障,然后我会通过在正确的时间播放正确的音频来纠正自己!
笔记
我还没有测试过这段代码,但它似乎是正确的方法。如果它真的有效,我会再次更新这篇文章。
PS 搜索MediaPlayer
是: 1. 肯定会延迟我的音乐的繁重操作(这里每毫秒都很重要) 2. 不是线程安全的,不能从多个线程中使用(搜索、启动等...)