在 jQuery 中“转换”具有多个音轨的音频播放器

Posted

技术标签:

【中文标题】在 jQuery 中“转换”具有多个音轨的音频播放器【英文标题】:"Converting" in jQuery an audio player with multiple tracks 【发布时间】:2015-06-18 00:21:34 【问题描述】:

我有一个曲目列表,我想通过播放和暂停按钮提供 3 首歌曲的预览。

这是我现在在 JS 中的凌乱的 sn-p:

var playing = false;
playpause01.addEventListener('click', function () 
    if (!playing) 
        document.getElementById('player01').play();
        this.src = 'files/img/pause.png';
     else 
        document.getElementById('player01').pause();
        this.src = 'files/img/play.png';
    
    playing = !playing;
);
playpause04.addEventListener('click', function () 
    if (!playing) 
        document.getElementById('player04').play();
        this.src = 'files/img/pause.png';
     else 
        document.getElementById('player04').pause();
        this.src = 'files/img/play.png';
    
    playing = !playing;
);
playpause13.addEventListener('click', function () 
    if (!playing) 
        document.getElementById('player13').play();
        this.src = 'files/img/pause.png';
     else 
        document.getElementById('player13').pause();
        this.src = 'files/img/play.png';
    
    playing = !playing;
);

对于我在 html 中的每首曲目:

<audio id="player01" src="files/blabla.ogg"></audio>
        <img style="position:absolute;left:-80px" id="playpause01" src="files/img/play.png" />

现在,这个 sn-p 有 2 个问题: 1)我需要单独定位 3 个不同的元素(对于我要预览的每首歌曲) 2)如果我在播放一首新歌的同时播放一首新歌,两首歌曲会重叠。

我认为用 jQuery 重写 sn-p 会容易得多。我该如何解决这 2 个问题?

这是 JsFiddle 的起点: http://jsfiddle.net/multiformeingegno/jdk0b5L4/

【问题讨论】:

【参考方案1】:

你可以像这样使用一个普通的监听器:

$('ol').on('click', 'li img', playAudio);
var currentlyPlaying;
function playAudio(e)
    var audElement = $(e.target).siblings('audio')[0];
    window.aa = audElement;
    if(audElement && audElement.paused)
        if(currentlyPlaying)
            currentlyPlaying.pause();            
        currentlyPlaying = audElement;
        addListeners(currentlyPlaying);
        currentlyPlaying.play();            
    else if(audElement)
        audElement.pause();
    


function addListeners(aud)
    aud.removeEventListener('ended', onPause);  // remove done to remove previous listener
    aud.removeEventListener('pause', onPause);
    aud.removeEventListener('playing', onPlay);
    aud.addEventListener('ended', onPause);
    aud.addEventListener('pause', onPause);
    aud.addEventListener('playing', onPlay);


function onPlay(e)
    $(e.target).siblings('img')[0].src = 'http://luca-longobardi.com/files/img/pause.png';

function onPause(e)
    e.target.currentTime = 0;   // reset to beginning
    $(e.target).siblings('img')[0].src = 'http://luca-longobardi.com/files/img/play.png';

fiddle demo

【讨论】:

@MultiformeIngegno,一首曲目淡出,另一首开始? 是的,当我点击播放按钮时,如果一首曲目已经在播放,它会消失,而另一首则开始 是的,这会很棘手,您可能需要使用web-audio,这是cross-fade 的示例

以上是关于在 jQuery 中“转换”具有多个音轨的音频播放器的主要内容,如果未能解决你的问题,请参考以下文章

如何填充音轨的开头?

在 ffmpeg 中混合音轨的文件上添加另一个音频

从 mp4 中提取音轨并将其保存到可播放的音频文件中

使用 AVPlayer 音频播放 AVMutableComposition 会不同步

SoundTouch实现音频变速变调

Javascript 音频不会停止并同时播放多个音轨