我非常失望地发现,现在我已经准备好将我的 html5 应用程序迁移到使用 phonegap 的手机上,播放音频的能力就像永动机一样。它几乎就在那里,但并不完全。
Androids(至少在冰淇淋三明治之前)的答案是 Phonegap 媒体 API。据大家说。
问题是我在播放音频时真的很关心当前时间。在我运行 Chrome 的 Mac 上,我计时了需要多长时间:
pos=audio.currentTime
它不到一毫秒。
使用 Phonegap 媒体 api,我必须调用一个异步函数,等待它回调,然后我得到当前的媒体位置。这需要 5 到 150 多毫秒。它并不一致,而且速度非常缓慢。
它也引出了一个问题:现在几点了?如果获取时间需要 150 毫秒,我是在这 150 毫秒的开始还是结束时获得时间?我真的无法确定我得到的时间是否真的接近当前时间。
我还没有编写潜艇导航软件,这是一件好事,因为时间如此可怕,我永远无法确定自己在哪里。
我现在使用系统时钟来跟踪时间,并使用 getCurrentPosition() 不时重新同步。但是,我仍然可以延迟一百多毫秒。
我的问题:有人有更好的方法吗?
编辑:
查看 Cordova 的代码:
/**
* Get current position of playback.
*
* @return position in msec or -1 if not playing
*/
public long getCurrentPosition() {
if ((this.state == STATE.MEDIA_RUNNING) || (this.state == STATE.MEDIA_PAUSED)) {
int curPos = this.player.getCurrentPosition();
this.handler.webView.sendJavascript("cordova.require('cordova/plugin/Media').onStatus('" + this.id + "', " + MEDIA_POSITION + ", " + curPos / 1000.0f + ");");
return curPos;
}
else {
return -1;
}
}
在我看来,这应该执行得相当快……除了对 sendJavascript() 的调用。我想知道这是否是神秘延迟的根源?
出于我的目的,我不需要 onStatus 事件:我需要尽快获得当前位置。所以我想知道我是否可以删除那行代码......我想这将需要对 Cordova 源代码本身进行更改。:(