答えてくれてありがとうマイク。残念ながら、これは私を助けません。
00:00 に 3:45 の長さの曲の再生を開始するように MediaPlayer に依頼したとします。
01:00 に電話のリソースの使用を開始しました。使用量が多かったため、電話に不具合が発生し、MediaPlayer が 2 秒間一時停止しました。
時間:
00:00-01:00 - 00:00-01:00に音声が聞こえた
01:00-01:02 -電話が故障したため沈黙が聞こえた
01:02-03:47 - 01 に音声が聞こえた: 00-03:45 2 秒のタイム スキューを伴う
現在、私が理解していることから、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.スレッドセーフではなく、複数のスレッドから使用できません(シーク、開始など...)