0

MediaPlayer を使用しているときに、電話がスタックするたびに、MediaPlayer が故障し、故障したオーディオの位置から再生を続けることに気付きました。
特定の時間にオーディオを再生したいので、これは私の実装には適していません。

1000 ミリ秒の長さの曲がある場合、特定の時間tで再生を開始し、時間t+1000で正確に停止するようにMediaPlayer を設定する機能が必要です。

これは、実際には 2 つのことが必要であることを意味します
。1) MediaPlayer を特定の時間に非常にわずかな遅延で開始します。
2) MediaPlayer の不具合で不具合が発生したオーディオを無視し、時間通りに曲を終了するために再生を続行します。

関数の遅延は私にとって非常に重要であり、オーディオが再生されるはずだった時間に正確に (~) 再生される必要があります。

ありがとう!

4

2 に答える 2

0

答えてくれてありがとうマイク。残念ながら、これは私を助けません。

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.スレッドセーフではなく、複数のスレッドから使​​用できません(シーク、開始など...)

于 2012-12-23T21:27:48.103 に答える
0

おそらくmp.getDuration();、および/またはmp.getCurrentPosition();「再生されるはずだった時間に正確に(〜)オーディオを再生する必要がある」という意味を正確に知ることは不可能ですが、使用する必要があります。

このようなものから始める必要があります:

 int a = (mp.getCurrentPosition() + b);
于 2012-12-23T04:30:24.877 に答える