我想播放单个音频文件(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的其他所有内容都有效,但持续时间。
有没有解决方法可以解决这个问题?
答案 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
});
为我工作。