不要工作JS音频随机声音

时间:2018-01-04 23:55:42

标签: javascript html audio

我创建了音频按钮。当我们点击按钮时声音将开始,我们将再次点击停止它。当我们按下按钮时,我想要随机不间断的声音。我创建了一个示例JS,但是当声音结束时,声音不会自动改变。

我最近尝试过以下代码。当我使用此代码时,按钮开始发声(okey),声音正在改变(okey),但是当我们暂停点击时,声音不会停止。当我们再次点击时,声音会发生变化,声音会再次变化。我应该尝试什么样的方法?



	   var sounds = new Array();
            sounds[0]="http://static1.grsites.com/archive/sounds/background/background001.mp3";
            sounds[1]="http://static1.grsites.com/archive/sounds/background/background002.mp3";
            sounds[2]="http://static1.grsites.com/archive/sounds/background/background003.mp3";   
            sounds[3]="http://static1.grsites.com/archive/sounds/background/background004.mp3";
            sounds[4]="http://static1.grsites.com/archive/sounds/background/background005.mp3";
            
	
	
	document.getElementById("playpause").addEventListener("click", function getRandomSounds(){
	var audio = document.getElementById('testAudio');
	var randomNum = Math.floor(Math.random() * sounds.length);
    document.getElementById("testAudio").src = sounds[randomNum];
	

	
  if(this.className == 'is-playing'){
    this.className = "";
    this.innerHTML = "Pause"
    audio.pause();
	
  }else{
    this.className = "is-playing";
    this.innerHTML = "Play";
    audio.play();

  }

   document.getElementById("testAudio").addEventListener("ended", getRandomSounds);
   getRandomSounds();
   
});

 <html>
 <body>
  <input type="checkbox" value="None" id="playpause" name="check" />
    <label for="playpause" tabindex=1></label>
 <audio id="testAudio"></audio>
 </body>
 </html>
&#13;
&#13;
&#13;

尝试删除以下代码:

document.getElementById("testAudio").addEventListener("ended", 
getRandomSounds);

2 个答案:

答案 0 :(得分:0)

我已经通过浏览器播放声音做了一个合理的数量,我找到的最佳选择是使用soundmanager js。我从这里使用了SoundManager2:http://www.schillmania.com/projects/soundmanager2/demo/template/我确信还有其他的可以工作。问题是不同的浏览器具有不同的功能和期望,因此为了获得最佳工作方案,您需要使用带有flash作为备份选项的html5。我可以验证我链接的那个在Edge,Firefox和Chrome(桌面和移动设备)中工作,但我无法确认任何其他浏览器。我一直在仓库应用程序中使用它来进行音频响应,因此我也可以验证它在正确实现时是否可靠,但我没有在它或接口上使用播放/暂停。我只是从后台玩。

这是我的设置作为一个实现示例,如果你最终使用那个:

var soundReady = false;
var QueuedSounds = [];

soundManager.setup({
    url: '/Scripts/SoundManager/',
    // flashVersion: 9, // optional: shiny features (default = 8)
    preferFlash: false,
    onready: function () {
        // Ready to use; soundManager.createSound() etc. can now be called.
        soundReady = true;
        QueuedSounds.Each(function (s) {
            var mysound = soundManager.createSound({
                id: 'mySound',
                url: s.filename,
                autoLoad: true,
                autoPlay: true,
                onfinish: function () {
                    this.destruct();
                },
                volume: 100
            });

        });
    }
});


function PlaySound(filename, mime) {
    if (soundObject != null) {
        $(soundObject).remove();
        soundObject.removed = true;
        soundObject = null;
    }
    if (soundReady) {
        var mysound = soundManager.createSound({
            id: 'mySound',
            url: filename,
            autoLoad: true,
            autoPlay: true,
            onfinish: function () {
                this.destruct();
            },
            volume: 100
        });
    }
    else {
        QueuedSounds.push({ filename: filename, mime: mime });
    }

}

答案 1 :(得分:0)

您的解决方案似乎存在一些逻辑问题。最大的问题是复选框与标签的引用元素混淆(所以我简化为一个按钮),并且你正在使用相同的事件进行播放/暂停,就像排队下一个项目一样。因此,只要它试图排队一个,它也会暂停。

<html>

  <body>
    <input type="button" value="Play" id="playpause">
    <audio id="testAudio"></audio>
  </body>

</html>


   var sounds = new Array();
   sounds[0] = "http://static1.grsites.com/archive/sounds/background/background001.mp3";
   sounds[1] = "http://static1.grsites.com/archive/sounds/background/background002.mp3";
   sounds[2] = "http://static1.grsites.com/archive/sounds/background/background003.mp3";
   sounds[3] = "http://static1.grsites.com/archive/sounds/background/background004.mp3";
   sounds[4] = "http://static1.grsites.com/archive/sounds/background/background005.mp3";



   document.getElementById("playpause").addEventListener("click", function() {

     var audio = document.getElementById('testAudio');

     var doPlay = this.className != 'is-playing' && audio.src != null;

     if (audio.src == null) {
       getRandomSound();
     }

     if (this.className == 'is-playing') {
       this.className = "";
       this.value = "Play"
       audio.pause();

     } else if(doPlay) {
       this.className = "is-playing";
       this.value = "Pause"
       audio.play();
     }

     document.getElementById("testAudio").addEventListener("ended", getRandomSounds);


   });

   function getRandomSound() {
     var audio = document.getElementById('testAudio');
     var randomNum = Math.floor(Math.random() * sounds.length);
     document.getElementById("testAudio").src = sounds[randomNum];

     audio.play();

   };

我也在这里进行了更新,以便暂停只是暂停,并且不会更改所选曲目,直到您刚刚结束的曲目为止。我不确定这是否属于预期,但根据描述,我猜这是你想要的。否则,它是一个简单的编辑,可以在每个新的开始时转到新的轨道。