2012-12-22 19 views
0

使用MediaPlayer时,我注意到每当我的手机出现问题时,MediaPlayer会出现毛刺,然后继续从音频中的位置播放它。
由于我希望在特定时间播放音频,因此这对我的实施很不利。

如果我有1000毫秒长的一首歌,我想是设置的MediaPlayer开始在一些特定的时间玩牛逼的能力,然后在在时间T + 1000正好停止。

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

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

谢谢!

回答

0

您需要使用mp.getDuration();和/或mp.getCurrentPosition();,虽然不可能完全知道您的意思,“我需要音乐在播放时应该准确播放(〜)。”

像这样的东西应该让你开始:

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

感谢您的回答麦克。但不幸的是,这不会帮助我。

假设我让MediaPlayer在00:00开始播放长度为3:45的歌曲。
01:00我开始使用手机的资源,由于我的手机用量过大,使MediaPlayer暂停2秒。

时间:

00:00-01:00 -我听到了声音,在00:00-01:00
01:00-01:02 -我听到沉默,因为手机glitched
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的搜索结果如下: 1.一个沉重的操作,肯定会延迟我的音乐(每毫秒数在这里) 2.不是线程安全的,不能用于多线程(寻求,启动等...)

相关问题