0

使用 MediaPlayer 时,我注意到每当我的手机卡住时,MediaPlayer 就会出现故障,然后从出现故障的音频位置继续播放。
这对我的实施不利,因为我希望在特定时间播放音频。

如果我有一首 1000 毫秒长度的歌曲,我想要的是能够将 MediaPlayer 设置为在某个特定时间t开始播放,然后在时间t+1000准确停止。

这意味着我实际上需要两件事:
1)在特定时间以非常小的延迟启动 MediaPlayer。
2) 让 MediaPlayer 出现故障忽略它们出现故障的音频并继续播放以按时完成歌曲。

功能的延迟对我来说非常重要,我需要在应该播放的时间准确播放音频(~)。

谢谢!

4

2 回答 2

0

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

假设我让 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. 不是线程安全的,不能从多个线程中使用(搜索、启动等...)

于 2012-12-23T21:27:48.103 回答
0

您可能需要使用mp.getDuration();和/或mp.getCurrentPosition();尽管不可能确切地知道“我需要在应该播放的时间准确播放音频(~)”是什么意思。

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

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