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
我想播放单个音频文件 (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