JS无法获取正在播放的audio的src等属性 / audio的duration为NaN

打算设计一个播放器,其中一个函数控制点击菜单某首歌曲即可播放,在该函数内调用music.play()后继续console.log(music.src)是可以正常显示src路径的。

然而在另一个控制播放下一曲的函数中,不论输出src还是currentSrc都是显示未定义,甚至输出currentTime等相关属性都是显示为0.相关代码如下:

function prevSong(msc){    //上一首歌
        let s = msc.currentSrc;
        let tar;
        /*
           返回当前播放的节点给tar,代码略
        */
        msc.pause();
        if(tar.previousSibling.nodeName == 'LI'){
            let index = tar.previousSibling.innerHTML;
            msc.src = 'src/music/'+index+'.mp3';
        }else{
            let chd = tar.parentNode.childNodes;
            let res = chd[chd.length-1];
            msc.src = 'src/music/'+res.innerHTML+'.mp3'
        }
        //msc.load();
        msc.play();
    }

另外,如何正常获取音频长度duration?我照着网上各种解决方法,使用了onloadedmetadata甚至是promise,输出的都是NaN

直接把demo给post上来吧:http://www.malakh.xyz/demo2/
js:http://www.malakh.xyz/demo2/s...

阅读 5.4k
3 个回答
✓ 已被采纳新手上路,请多包涵

需要这样获取audio才行:

var player = $("#msc")[0];

如果直接获取$("#msc"),使用play属性确实可以直接播放,但是无法给这个audio设置src属性以及获取音频时常。
获取音频时常:

var duration = player.duration

如果你是动态获取的播放地址,在第一次加载音频的时候,可能无法立即获取时常,所以你需要设置一个定时器,每10毫秒检测一次duration

//当前歌曲总时长
    function getTime() {
        setTimeout(function () {
            var duration = player.duration;
            if (isNaN(duration)) {
                getTime();
            }
        }, 10);
    }

音频需要加载了才有相应属性的,否则都是NaN啊。
因为你需要动态替换src,而又没有提供代码,所以不好分析原因。
一般需要先暂停现在播放的对象,然后把audio对象实体的src属性更改,再进行播放。
你可以参考jsplayer、jwplayer之类的相关代码,他们封装的很好。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题