Phonegap - Android 4.4 - html5 音频长度错误(javascript 和媒体插件)

Phonegap - Android 4.4 - html5 audio wrong length (javascript and media plugin)

我想播放单个音频文件 (mp3),唯一的问题是媒体长度。

它在 Android 5.0.1 上工作正常,但在 4.4.2/4.4.4 上它不工作!

通过本机实现,我得到了一个值,但它是不正确的,如果我使用媒体插件 API(来自 Phonegap),media.duration 未定义并且 media.getDuration() returns -1.

我试图仅在触发 loadedmetadata 事件后才获取持续时间,所以这不是问题所在。 本机实现是通过带有 new Audio() 的 js 完成的,不涉及 DOM 元素。 文件存储在sdcard上,src看起来像file:///storage/sdcard/audio.mp3。关于 html5 音频 api 的其他一切都有效,但持续时间。

有解决办法吗?

硬编码值。这很痛苦,但如果文件是本地的,你可以这样做。

我 运行 遇到一个问题,其中 chrome 报告的持续时间值与其他浏览器不同,这就是我们着陆的地方。我知道这不是真正的解决方案,但它确实有效。

或者...您可以使用一些外部进程来生成 json 持续时间,并在运行时引用这些值。

尝试Media.node.duration。这适用于 windows... 对于它的价值,只要在间隔内调用 getDuration,我在 Android 4.4 上没有任何问题。但我只使用媒体插件 new Media(src, onSuccess, onError, playbackStatus) 而不是 HTML5 播放器。

感谢@tawpie 的回答,我找到了解决我遇到的这个问题的方法。 setInterval 让我知道我的自定义搜索栏在播放音频时得到了(正确)更新,在计算它的宽度时我使用了音频持续时间值,结果表明持续时间在媒体文件播放方法之后有效被解雇了。

问题loadedmetadata 事件没有 return 正确的持续时间值(在某些浏览器中,例如 android webView),但在音频播放至少 1 秒后,持续时间会更新,您可以使用它。

所以你可以忘记 loadedmetadata 事件并直接跳到 canplay 事件,然后你可以做这样的事情:

var myAudio = new Audio();
myAudio.src = 'file://mnt/sdcard/audio.mp3';
myAudio.load();
myAudio.correctDuration = null;

myAudio.addEventListener('canplay', function(){

   myAudio.play();
   myAudio.muted = true;
   setTimeout(function(){
      myAudio.pause();
      myAudio.currentTime = 0;
      myAudio.muted = false;

      myAudio.correctDuration = myAudio.duration;

   },1000);

});

...当然可以用volume = 0.0/1.0代替静音
另一种方法是创建一个辅助函数(在我的例子中是一个 AngularJS 服务),它接受你的 src 值并使用上面的代码和 returns correctDuration。如果您有音频 timeUpdate 的听众会更改 DOM.

,则首选此方法

媒体插件的工作方式完全相同 - 如果音频未播放至少 1 秒,则不能使用 getDuration() 方法或 duration 属性 在 interval/timeout 包装器以获得正确的持续时间。

我认为视频元素的行为类似。我这几天去测试一下。
希望此解决方法有所帮助!

供参考:

audio.addEventListener('durationchange', function(e) {
    console.log(e.target.duration); //FIRST 0, THEN REAL DURATION
});

对我有用。

来源:this stackowerflow question