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

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

本文关键字:javascript 媒体 插件 错误 4-html5 音频 Phonegap-Android      更新时间:2023-09-26

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

它在安卓5.0.1上运行良好,但在4.4.2/4.4.4上不起作用!

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

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

有什么解决方案可以解决这个问题吗?

感谢@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值,并使用上面的代码并返回正确的Duration。如果您有更改DOM的音频timeUpdate的侦听器,则首选此选项。

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

我认为视频元素的行为类似。这几天我会测试一下
希望这个变通方法能有所帮助!

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

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

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

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

为了参考:

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

为我工作。

来源:这个堆栈流问题