当前位置:  开发笔记 > 编程语言 > 正文

如何通过函数获取audio.duration值

如何解决《如何通过函数获取audio.duration值》经验,为你挑选了1个好方法。

我的音频播放器我需要获得音轨的持续时间.我需要一个函数来获取音频的src并返回其持续时间.这是我想要做的但不起作用:

function getDuration(src){
    var audio = new Audio();
    audio.src = "./audio/2.mp3";
    var due;
    return getVal(audio);
}
function getVal(audio){
    $(audio).on("loadedmetadata", function(){
        var val = audio.duration;
        console.log(">>>" + val);
        return val;
    });
}

我试图分成两个功能,但它不起作用.如果它像工作功能那样会很棒.

任何的想法?



1> 小智..:

因为您依赖于要触发的事件,所以您无法在getDuration或getVal中返回值

相反,你想使用一个回调函数,像这样(回调)

该示例假设您希望将持续时间放入这样写的跨度中



function getDuration(src, cb) {
    var audio = new Audio();
    $(audio).on("loadedmetadata", function(){
        cb(audio.duration);
    });
    audio.src = src;
}
getDuration("./audio/2.mp3", function(length) {
    console.log('I got length ' + length);
    document.getElementById("duration").textContent = length;
});

任何需要"知道"长度的代码都应该在回调函数内(console.log所在的位置)


使用Promises

function getDuration(src) {
    return new Promise(function(resolve) {
        var audio = new Audio();
        $(audio).on("loadedmetadata", function(){
            resolve(audio.duration);
        });
        audio.src = src;
    });
}
getDuration("./audio/2.mp3")
.then(function(length) {
    console.log('I got length ' + length);
    document.getElementById("duration").textContent = length;
});

使用事件 - 注意'myAudioDurationEvent'显然可以(几乎)任何你想要的东西

function getDuration(src, obj) {
    return new Promise(function(resolve) {
        var audio = new Audio();
        $(audio).on("loadedmetadata", function(){
            var event = new CustomEvent("myAudioDurationEvent", {
                detail: {
                    duration: audio.duration,

                }
            });
            obj.dispatchEvent(event);
        });
        audio.src = src;
    });
}
var span = document.getElementById('xyz'); // you'll need to provide better logic here
span.addEventListener('myAudioDurationEvent', function(e) {
    span.textContent = e.detail.duration;
});
getDuration("./audio/2.mp3", span);

虽然,通过将目的地传递到这些解决方案中的修改后的getDuration函数,可以类似地使用回调或承诺来完成这一点 - 如果例如一个跨度更新持续多次,我对使用事件侦听器的观点更合适 - 这个解决方案仍然只是每个只跨越一次,所以可以通过其他方法轻松实现


鉴于此答案的评论中的新信息,我认为这是更好的解决方案

function getDuration(src, destination) {
    var audio = new Audio();
    $(audio).on("loadedmetadata", function(){
        destination.textContent = audio.duration;
    });
    audio.src = src;
}

然后根据需要调用getDuration

var span = createOrGetSomeSpanElement();
getDuration("./audio/2.mp3", span);

createOrGetSomeSpanElement返回要在getDuration函数中使用的目标元素- 如何完成这取决于你,看到你在循环中创建一个播放列表,我猜你已经创建了一些元素来接收已经创建的音频长度 - 这很难回答有时问半个问题

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有