【问题标题】:Control multiple html5 audio tracks using a single controller使用单个控制器控制多个 html5 音轨
【发布时间】:2013-08-03 17:23:19
【问题描述】:

我正在尝试为网站实现一个非常简单的音频播放器。

界面比较简单。它有一个播放/暂停按钮和一个静音/取消静音按钮。

我遇到的问题是为不同的轨道实现同一播放器的多个实例。

播放器的javascript是:

jQuery(function() {
    var myAudio = document.getElementById("myAudio");
    var btnPlayPause = document.getElementById("btnPlayPause");
    var btnMute = document.getElementById("btnMute");

    btnPlayPause.addEventListener("click", function() {
        if (myAudio.paused || myAudio.ended) {
            myAudio.play();
            btnPlayPause.innerHTML = "<span aria-hidden=\"true\" data-icon=\"&#xe003;\"></span><span class=\"screen-reader-text\">Play</span>";
        }
        else {
            myAudio.pause();
            btnPlayPause.innerHTML = "<span aria-hidden=\"true\" data-icon=\"&#xe002;\"></span><span class=\"screen-reader-text\">Pause</span>";
        }
    });

    btnMute.addEventListener("click", function() {
        if (myAudio.muted) {
            myAudio.muted = false;
            btnMute.innerHTML = "<span aria-hidden=\"true\" data-icon=\"&#xe001;\"></span><span class=\"screen-reader-text\">Mute</span>";
        }
        else {
            myAudio.muted = true;
            btnMute.innerHTML = "<span aria-hidden=\"true\" data-icon=\"&#xe000;\"></span><span class=\"screen-reader-text\">Unmute</span>";
        }
    });
});

这适用于单轨。但如果我在同一页面上有多个曲目,这就会成为问题。

我猜我需要对定义 myAudio 变量的语法进行一些修改:

var myAudio = document.getElementById("myAudio");

但是,我不确定如何更改它,以便同一个脚本可以控制多个音轨。

如果可能,我还希望能够确保如果用户单击不同曲目上的播放按钮,当前正在播放的曲目“停止”或“暂停”并且新曲目开始(所以 2曲目没有相互重叠播放)。

【问题讨论】:

  • 里面有问题吗?
  • 是的,如何修改脚本,让同一个脚本可以控制多个不同的轨道。现在。如果我在一个曲目上单击播放,所有曲目都会同时播放。
  • 如果我想要一个播放列表,那就太好了。在这种情况下,没有播放列表,但每个曲目旁边都有一个播放按钮。我需要让播放按钮播放相关的曲目,并且只播放该曲目。如果您单击另一个曲目旁边的播放按钮,则当前正在播放的曲目将暂停,并播放新单击的曲目。但是该解决方案对于站点范围内的第二个播放器很有用,因此仍然非常有用。

标签: javascript html html5-audio jquery


【解决方案1】:

这是基于 jQuery 的解决方案。要使 HTML5 音频在 IE8/7 中也能正常工作,请使用一些额外的 flash fallback

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title> - jsFiddle demo</title>
  <script type='text/javascript' src='//code.jquery.com/jquery-1.10.1.js'></script>
  <style type='text/css'>
.mp3Player {
    padding:8px;
    margin:8px;
    background-color:#ddf;
}
  </style>

<script type='text/javascript'>//<![CDATA[ 

jQuery(function (){
    var myAudio = document.getElementById("myAudio");
    var current = null;
    var playingString = "<span aria-hidden=\"true\" data-icon=\"&#xe002;\"></span><span class=\"screen-reader-text\">Pause</span>";
    var pausedString = "<span aria-hidden=\"true\" data-icon=\"&#xe003;\"></span><span class=\"screen-reader-text\">Play</span>";
    $(document.body).on('click', '.btnPlayPause',function(e){
        var target = this;
        //console.log(target, current); //return;
        if (current == target) {
            target.innerHTML = pausedString;
            target.parentNode.setAttribute('data-pos', myAudio.currentTime); //start from paused
            myAudio.pause();
            current = null;
        } else { // current!=target
            if (current != null) {
                current.innerHTML = pausedString;
                current.parentNode.setAttribute('data-pos', '0'); //reset position
                target.parentNode.setAttribute('data-pos', myAudio.currentTime); //start from paused
            }
            current = target;
            target.innerHTML = playingString;
            if(myAudio.canPlayType && myAudio.canPlayType("audio/mpeg") != "") { // MP3
                myAudio.src = target.parentNode.getAttribute('data-src');
            } else if(myAudio.canPlayType && myAudio.canPlayType("audio/ogg") != "") {  // OGG
                myAudio.src = target.parentNode.getAttribute('data-src2');
            } else {
                return; // no audio support
            }
            myAudio.play();
            myAudio.onloadeddata = function () {
                myAudio.currentTime = parseFloat(target.parentNode.getAttribute('data-pos'));
            };
        }
    });
    $(document.body).on('click', '.btnMute',function(e){
        myAudio.muted = !myAudio.muted;
        $('.btnMute').each(function(){
            if (myAudio.muted) {
                this.innerHTML = "<span aria-hidden=\"true\" data-icon=\"&#xe001;\"></span><span class=\"screen-reader-text\">Muted</span>";
            } else {
                this.innerHTML = "<span aria-hidden=\"true\" data-icon=\"&#xe000;\"></span><span class=\"screen-reader-text\">Audible</span>";
            }
        });
    });
});

//]]>  
</script>
</head>
<body>

<audio id="myAudio"></audio>

<div class="mp3Player" data-src="a.mp3" data-src2="a.ogg" data-pos="0">
    <button class="btnPlayPause button">►||</button>
    <button class="btnMute button">MUTE</button>
    <span class="infoLabel">Audio #1</span>
</div>

<div class="mp3Player" data-src="b.mp3" data-src2="b.ogg" data-pos="0">
    <button class="btnPlayPause button">►||</button>
    <button class="btnMute button">MUTE</button>
    <span class="infoLabel">Audio #2</span>
</div>

</body>
</html>

jQuery code + result page

javascript code + result page

两个脚本都需要额外的现有 .mp3 文件来播放声音

【讨论】:

  • Stano,看起来不错,两个快速的问题。你能帮我把它改成一个无冲突的 jQuery 脚本吗,另外,你能帮我修改播放/暂停按钮的样式,以使用 &lt;span aria-hidden=\"true\" data-icon=\"&amp;#xe003;\"&gt;&lt;/span&gt;&lt;span class=\"screen-reader-text\"&gt;Play&lt;/span&gt; 播放和 &lt;span aria-hidden=\"true\" data-icon=\"&amp;#xe002;\"&gt;&lt;/span&gt;&lt;span class=\"screen-reader-text\"&gt;Pause&lt;/span&gt; 暂停。因此,相同的按钮将播放/暂停,但会根据状态具有不同的播放/暂停图标。这些是自定义播放和暂停图标。在这个播放器中,我不需要静音按钮。
  • 另外,我看到了一个 onload 事件。任何曲目都不应在加载时播放,而应仅在点击时播放。
  • 好吧,添加了 jQuery 替代品并更新了所有 IE 不兼容的代码jsfiddle.net/F35Fw/10
  • 我假设它是 jQuery noconflict,我只是将 $ 替换为 jQuery,就这样?
  • 我还有一个问题。这仅播放 .mp3 文件。理想情况下,它应该播放 .mp3 或 .ogg,具体取决于浏览器功能,并且只加载浏览器可以播放的音频文件版本(不能同时播放)。假设文件名相同,并且只有文件扩展名发生变化,我如何进行测试以确定功能然后获取适当的音频格式。因此,文件名可以是mozbeemora_beethoven1_cadenza_1,根据浏览器的不同,它会得到.mp3.ogg
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多