按钮停止多个音轨

Posted

技术标签:

【中文标题】按钮停止多个音轨【英文标题】:Button stops multiple audio tracks 【发布时间】:2017-06-18 14:43:31 【问题描述】:

我正在创建一个 Launchpad,每行由 8 个按钮/音轨和一个停止按钮组成。我希望每个停止按钮在按下时停止该行上的所有音频播放,例如停止按钮 1 将停止声音 (1) 到声音 (8)。有任何想法吗?我将在下面留下我的代码(忽略用于图像的 offImg/onImg):

JS:

var audio = [];
var isPlaying = [];

function sound(id)
  if(isPlaying[id])
    audio[id].pause();
    isPlaying[id] = false;
    audio[id].currentTime = 0;
  
  else
    audio[id].play();
    isPlaying[id] = true;
    audio[id].currentTime = 0;
  


function createAudio(src,i)
  audio[i] = new Audio();
  audio[i].src = src;
  audio[i].loop = true;
  isPlaying[i] = false;

html

<img class="top" src="images/pink.png" onclick="sound(1); this.src = (this.src.endsWith(offD1)? onImgPnk : offD1);"/>
<img class="top" src="images/pink.png" onclick="sound(2); this.src = (this.src.endsWith(offD2)? onImgPnk : offD2);"/>
<img class="top" src="images/pink.png" onclick="sound(3); this.src = (this.src.endsWith(offD3)? onImgPnk : offD3);"/>
<img class="top" src="images/pink.png" onclick="sound(4); this.src = (this.src.endsWith(offD4)? onImgPnk : offD4);"/>
<img class="top" src="images/pink.png" onclick="sound(5); this.src = (this.src.endsWith(offD5)? onImgPnk : offD5);"/>
<img class="top" src="images/pink.png" onclick="sound(6); this.src = (this.src.endsWith(offD6)? onImgPnk : offD6);"/>
<img class="top" src="images/pink.png" onclick="sound(7); this.src = (this.src.endsWith(offD7)? onImgPnk : offD7);"/>
<img class="top" src="images/pink.png" onclick="sound(8); this.src = (this.src.endsWith(offD8)? onImgPnk : offD8);"/>
<img class="muteTop" src="images/mute.png" onclick="this.src = (this.src.endsWith(offImg)? onImgMut : offImg);"/>
<div class="top"></div> ***** <--- THIS IS THE STOP BUTTON *****

编辑

var stopButton = document.getElementById(stop1); 

stopButton.addEventListener('click', stopAllAudio);

function stopAllAudio()
      var audios = document.getElementsByClassName("top"),
          len = audios.length,
          i = 0;
      for (; i < len; i++)
          audios[i].currentTime = 0;
          audios[i].pause();
          isPlaying[i] = false;
      

HTML:

<img class="top" src="images/pink.png" onclick="sound(1); this.src = (this.src.endsWith(offD1)? onImgPnk : offD1);"/>
<img class="top" src="images/pink.png" onclick="sound(2); this.src = (this.src.endsWith(offD2)? onImgPnk : offD2);"/>
<img class="top" src="images/pink.png" onclick="sound(3); this.src = (this.src.endsWith(offD3)? onImgPnk : offD3);"/>
<img class="top" src="images/pink.png" onclick="sound(4); this.src = (this.src.endsWith(offD4)? onImgPnk : offD4);"/>
<img class="top" src="images/pink.png" onclick="sound(5); this.src = (this.src.endsWith(offD5)? onImgPnk : offD5);"/>
<img class="top" src="images/pink.png" onclick="sound(6); this.src = (this.src.endsWith(offD6)? onImgPnk : offD6);"/>
<img class="top" src="images/pink.png" onclick="sound(7); this.src = (this.src.endsWith(offD7)? onImgPnk : offD7);"/>
<img class="top" src="images/pink.png" onclick="sound(8); this.src = (this.src.endsWith(offD8)? onImgPnk : offD8);"/>
<img class="muteTop" src="images/mute.png" onclick="this.src = (this.src.endsWith(offImg)? onImgMut : offImg);"/>
<div class="top" id="stop1"></div> ***** <--- THIS IS THE STOP BUTTON *****

【问题讨论】:

【参考方案1】:

希望这能给你一些想法。

var stopButton = ...; // select your stop button

stopButton.addEventListener('click', stopAllAudio);

function stopAllAudio()
    var audios = document.getElementsByTagName('audio'),
        len = audios.length,
        i;
    for (i = 0; i < len; i++)
        audios[i].currentTime = 0;
        audios[i].pause();
        isPlaying[i] = false;
    

您可以使用以下方式选择元素:

    Select by Id Select by ClassName Select by TagName

您可以使用addEventListener 在某些元素上触发函数。

您可以使用for loop 循环遍历选定的元素。

【讨论】:

谢谢,这似乎很有帮助。我是 JS 新手,知道如何实现它吗? 已更新。你的停止按钮有id吗?如果是,var stopButton = document.getElementById(/* stop button's id */); 如何向停止按钮添加 id? @NathanWilson 通过 HTML 添加 &lt;div class="top" id="stopButton"&gt;&lt;/div&gt; 是最简单的方法。 好吧我觉得我现在明白了,但是在实现代码之后它不允许我点击任何按钮。我已经编辑了我的问题中的代码,让您再看一看。【参考方案2】:

如果你的所有行都定义明确,你可以这样做:

HTML

<div class="row">
    <img class="top" src="images/pink.png" onclick="sound(1); this.src = (this.src.endsWith(offD1)? onImgPnk : offD1);"/>
    [...]
    <div class="stop"></div>
</div>

JS

$(document).on('click','.stop',function()
    $(this).siblings('img.top').each(function()
        audio[$(this).index()+1].pause();
        audio[$(this).index()+1].currentTime = 0;
        isPlaying[$(this).index()+1] = false;
    );
);

基本上,您会听到对.stop div 的点击。

当单击一个时,您会搜索同一父级中的所有其他 img.top 元素,然后将它们逐个 .pause() 搜索。

我在这里使用了 JQuery,因为它更简单、更快捷。 但如果你想要一个纯 javascript 解决方案,请告诉我。

【讨论】:

以上是关于按钮停止多个音轨的主要内容,如果未能解决你的问题,请参考以下文章

如何通过按下 Java Swing 按钮来停止线程?

播放/暂停/停止本地存储的多个音频文件

SoundPool“AudioFlinger 无法创建音轨,状态:-12”

AVQueuePlayer 在 iOS5 后台播放多个音轨

如何停止多个 UIButton 按下?

多个按钮上的声音并在其他人在 iOS 中播放时停止