Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何控制MediaPlayer启动延迟?_Android_Delay_Android Mediaplayer - Fatal编程技术网

Android 如何控制MediaPlayer启动延迟?

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播放一个声音,

首先,我的目标是以相同的开始时间在我的设备上播放声音。即使是100毫秒的延迟对我来说也是非常重要的。因此,我必须非常小心延迟管理

假设我使用网络时间协议将所有设备与同步。我正在连接0.tr.pool.ntp.org,加上额外的延迟,我有这样一个数据:

  • 您的系统时间:14:45:50.255000(a)(在我的设备上)
  • NTP时间:14:46:01.255000
它工作得很好。我有一个BroadcastReceiver类作为报警接收器。再次举个例子,我将在14:50:00.000播放一个声音,并将其发送给AlarmManager,如((14:50:00.000)-(a-b)),以便与NTP服务器同步

到目前为止,一切都很好。我的问题是从广播接收器上的延迟几乎250ms开始。此延迟永远不会超过1000ms++。我通过将报警时间更改为((14:50:00.000)-(a-b)-1000ms)解决了这个问题,然后在BroadcastReceiver上添加了(1000ms-c)延迟。它仍然很棒,感谢上帝:)

最后一步是播放声音,添加以下代码块非常简单:

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)