绑定MediaPlayer以在特定时间播放

时间:2012-12-22 09:28:56

标签: android android-mediaplayer timing

当使用MediaPlayer时,我注意到每当我的手机卡住时,MediaPlayer就会出现故障,然后继续播放它所闪烁的音频中的位置。
这对我的实现很不好,因为我希望在特定时间播放音频
如果我有1000毫秒长的歌,我想要的是能够设置MediaPlayer在特定时间开始播放 t ,然后在 t + 1000 。

这意味着我实际上需要两件事: 1)在特定时间以非常小的延迟启动MediaPlayer 2)使MediaPlayer毛刺忽略他们所拍摄的音频并继续播放以便按时完成歌曲。

函数的延迟对我来说非常重要,我需要在应该播放的时候准确地播放音频(〜)。

谢谢!

2 个答案:

答案 0 :(得分:0)

您可能需要使用可能mp.getDuration();和/或mp.getCurrentPosition();虽然无法确切地知道您的意思"我需要准确播放音频(〜 )当时应该播放。"

这样的事情应该让你开始:

 int a = (mp.getCurrentPosition() + b);

答案 1 :(得分:0)

谢谢Mike的回答。但不幸的是,这对我没有帮助。

假设我要求MediaPlayer在00:00开始播放长度为3:45的歌曲。
在01:00我开始使用手机的资源,由于使用频繁我电话故障使MediaPlayer暂停2秒钟。

时间:

<00> 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秒,然后我会通过在正确的时间播放正确的音频来纠正自己!

注意

我没有测试过这段代码,但它似乎是正确的方法。如果它真的有用,我会再次更新这篇文章。

P.S。在MediaPlayer寻找是: 一个沉重的操作肯定会延迟我的音乐(每毫秒计算一次) 2.不是线程安全的,不能从多个线程使用(寻找,启动等......)