首先,我的目标是在相同的开始时间在我的设备上播放声音。即使是延迟100ms 对我来说也非常重要。所以我必须非常小心延迟管理。
假设我使用网络时间协议同步我的所有设备。我正在连接 0.tr.pool.ntp.org ,如果有更多延迟,我会有这样的数据:
工作正常。我有一个BroadcastReceiver类作为警报接收器。再例如,我将在14:50:00.000发出声音并将其发送到AlarmManager,如((14:50:00.000) - (a - b)),以便与NTP服务器同步。
到这里一切都很棒。我的问题是在BroadcastReceiver上延迟差不多250毫秒(c)。这种延迟永远不会超过1000毫秒++。我解决了这个问题,将闹钟时间更改为((14:50:00.000) - (a - b) - 1000ms)然后在BroadcastReceiver上添加延迟(1000ms - c)< / strong>。感谢上帝仍然很棒:)
最后一步是播放声音,只需添加此代码块就很容易:
MediaPlayer player = MediaPlayer.create(getBaseContext(), R.raw.mysound);
player.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer player) {
player.release();
}
});
player.start();
此代码有效,但延迟呢?我决定在我的应用程序开始时测量这个延迟并保存它以便在时机成熟时使用。我使用那种方法:
private void synchronizeMediaPlayer(){
long startMs = new Date().getTime();
MediaPlayer player = MediaPlayer.create(getBaseContext(), R.raw.mysound);
player.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer player) {
player.release();
}
});
player.start();
long finishMs = new Date().getTime();
delayPlayer = finishMs - startMs; // this is static variable for using in any class
player.stop();
player.release();
}
确定。同样,delayPlayer
永远不会超过1000毫秒++。然后你可以估计,我将闹钟时间更改为((14:50:00.000) - (a - b) - 1000ms - 1000ms)然后添加的延迟(1000ms - delayPlayer) 播放声音之前。我认为这是最合理的方式。
结果:现在完成所有这些步骤后,我的声音在设备之间稍微延迟(如50ms-250ms)开始。我测量了所有延迟并控制了每一步。一切都是正确的但唯一的问题是delayPlayer
。我想,它总是在设备状态(RAM使用,后台服务等)方面发生变化。坦率地说,我开始认为这种变化不依赖于设备状态。因为我以1分钟的间隔测量它,然后看到它总是在变化。这种变化是非常不同的;现在150毫秒,1分钟后它变为300毫秒。
如何解决MediaPlayer延迟问题?我认为你真棒的程序员可以帮助我。
注意:我的英语可能不太好。对不起......