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

时间:2015-03-20 01:21:05

标签: javascript android html5 cordova audio

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

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

使用本机实现我得到一个值,但它不正确,如果我使用Media插件API(来自Phonegap),media.duration未定义且media.getDuration()返回-1。

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

有没有解决方法可以解决这个问题?

4 个答案:

答案 0 :(得分:2)

感谢@ tawpie的回答,我找到了解决这个问题的方法。 setInterval让我了解我的自定义搜索栏的事情在播放音频时已正确更新(正确)并计算其宽度我正在使用音频持续时间值,从而结果是媒体文件播放方法后的持续时间正常工作被解雇了。

问题loadedmetadata事件没有返回正确的持续时间值(在某些浏览器中,如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值并使用上面的代码并返回correctDuration。如果你有音频timeUpdate的听众改变了DOM,那么首选这个。

Media插件的工作方式完全相同 - 如果音频至少播放1秒,则无法在间隔/超时包装中使用getDuration()方法或duration属性来获取正确的持续时间

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

为了参考:

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

为我工作。

信用:this stackowerflow question