Android 如何控制MediaPlayer启动延迟?
首先,我的目标是以相同的开始时间在我的设备上播放声音。即使是100毫秒的延迟对我来说也是非常重要的。因此,我必须非常小心延迟管理 假设我使用网络时间协议将所有设备与同步。我正在连接0.tr.pool.ntp.org,加上额外的延迟,我有这样一个数据:Android 如何控制MediaPlayer启动延迟?,android,delay,android-mediaplayer,Android,Delay,Android Mediaplayer,首先,我的目标是以相同的开始时间在我的设备上播放声音。即使是100毫秒的延迟对我来说也是非常重要的。因此,我必须非常小心延迟管理 假设我使用网络时间协议将所有设备与同步。我正在连接0.tr.pool.ntp.org,加上额外的延迟,我有这样一个数据: 您的系统时间:14:45:50.255000(a)(在我的设备上) NTP时间:14:46:01.255000 它工作得很好。我有一个BroadcastReceiver类作为报警接收器。再次举个例子,我将在14:50:00.000播放一个声音,
- 您的系统时间:14:45:50.255000(a)(在我的设备上)
- NTP时间:14:46:01.255000
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
永远不会运行1000ms++。然后,正如您所估计的,我将报警时间更改为((14:50:00.000)-(a-b)-1000ms-1000ms),然后在播放声音之前添加了(1000ms-delayPlayer)的延迟。我认为这是最合理的方式
结果:在完成所有这些步骤后,我的声音在两台设备之间开始时会有一点延迟(比如50ms-250ms)。我测量了所有的延迟并控制了每一步。一切正常,但唯一的问题是delayPlayer
。我认为,它总是随着设备状态(RAM使用、后台服务等)的变化而变化。坦率地说,我开始认为这些变化并不取决于设备状态。因为我每隔1分钟测量一次,然后发现它总是在变化。这种变化是非常不同的喜欢;现在是150毫秒,1分钟后是300毫秒
如何解决MediaPlayer延迟问题?我想你们这些了不起的程序员可以帮助我
注意:我的英语可能不好。很抱歉…请使用计时记录器评测synchronizeMediaPlayer()方法。你看到了什么?我已经可以从我的日志中看到mediaplayer的启动和停止时间了。它与我的变量
delayPlayer
相同。请查看MediaPlayer.create()需要多长时间,这就是我建议使用计时日志的原因。我知道,但问题不是测量。问题是度量值不一样,永远不会与以前的度量值相同。这就是我建议对其进行分析的原因,我怀疑MediaPlayer。create()需要很长(未知)时间,因此您可以提前调用MediaPlayer.create(),只在需要时调用start(0)