Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何重复html5音频_Javascript_Html_Html5 Audio - Fatal编程技术网

Javascript 如何重复html5音频

Javascript 如何重复html5音频,javascript,html,html5-audio,Javascript,Html,Html5 Audio,请在回答之前阅读全文(谢谢): 我希望通过以下方式,以给定的次数(例如3次)无缝地重复一条曲目(例如10秒): 从给定的音频播放器中提取音频-不需要,从服务器加载.wav即可 连接音频n次(将音轨添加到音轨末端) 在新玩家中播放结果 怎么能做到呢?举个例子会很好,但2是最令人费解的 注意:将原始播放器设置为自身重复等不是一个选项,因为在大多数浏览器上都不流畅。我认为最无缝的方法是使用Javascript var sound=new Audio(document.getElementById("a

请在回答之前阅读全文(谢谢):

我希望通过以下方式,以给定的次数(例如3次)无缝地重复一条曲目(例如10秒):

  • 从给定的音频播放器中提取音频-不需要,从服务器加载.wav即可
  • 连接音频n次(将音轨添加到音轨末端)
  • 在新玩家中播放结果
  • 怎么能做到呢?举个例子会很好,但2是最令人费解的


    注意:将原始播放器设置为自身重复等不是一个选项,因为在大多数浏览器上都不流畅。

    我认为最无缝的方法是使用Javascript

    var sound=new Audio(document.getElementById("audio").src);
    for(var i=0;i<3;i++){
       sound.play();
    }
    
    var-sound=new-Audio(document.getElementById(“Audio”).src);
    
    对于(var i=0;i而言,唯一的方法是使用。然而,这是一个正在开发中的标准,因此尚未最终确定。

    解决此问题的一个肮脏解决方案是设置一个间隔:

    var sound = new Audio(document.getElementById("audio").src)
    var trackLength = 5000 // 5 seconds for instance
    var playthroughs = 3 //play through the file 3 times
    
    var player = setInterval(function(){
        if(playthroughs > 0){
            sound.play();
            playthroughs--;
        }
        else clearInterval(player)
    }, trackLength);
    
    编辑: 在有人向我指出我的代码可能需要一些改进后,我有点失控了。结果如下:

    var Sound = {
      que: {
        items: [],
    
        add: function(name){
          if(Sound.lib.items[name]) return Sound.que.items.push(Sound.lib.items[name]) - 1;
        },
    
        remove: function(key){
          Sound.que.items.splice(key, 1);
        },
    
        clear: function(){
          Sound.que.items = [];
        },
    
        play: function(startTrack){
          var playing = startTrack -1 || 0;
    
    
          var playNext = function(key){
            if(Sound.que.items[key]){
              if(Sound.que.items[key].isLoaded){
                var trackLength = Math.floor(Sound.que.items[playing].duration * 1000);
    
                Sound.que.items[key].play();
    
                var play = setTimeout(function(){
                  playing++
                  playNext(key +1)
                }, trackLength)
              }
              else{
                Sound.que.items[key].addEventListener('canplaythrough', function(){
                  playNext(key);
              })
            }
    
            }
          }
    
          playNext(playing);
        }
      },
      lib: {
        items: {},
    
        add: function(src, name){
          var obj = new Audio(src);
              obj.addEventListener('canplaythrough', function(){
                this.isLoaded = true;
              })
          if(!name){
            var key = 0;
            for(i in Sound.lib.items){
              key++;
            }
            name = key;
          }
    
          Sound.lib.items[name] = obj;
        },
    
        remove: function(name){
          if(typeof name == "string"){
            delete Sound.lib.items[name];
          }
        }
      },
    }
    
    这是一种面向对象的方法。它有一个简单的声音库和一个可以按任何顺序添加声音的que。我不知道它是否已完全调试,但它似乎工作得很好

    要将新音频文件添加到库中,请执行以下操作:

    Sound.lib.add('path/to/file.mp3', 'trackName'); //trackname will be numerical if none is given.
    
    要将音频文件添加到que,请执行以下操作:

    Sound.que.add('trackName');
    
    要玩游戏:

    Sound.que.play(2); // 2 indicates to start playing at the second sound in the que, assuming the que has 2 or more sounds in it.
    
    要清除问题,请执行以下操作:

    Sound.que.clear()
    

    这里还有一些其他功能,如清除que、从que和/或库中删除项目。但这并不难理解。

    O这个问题很老,为什么StackOverflow会向我展示这个问题

    一个简单的方法是在结束后再开始播放

    功能播放(音频、时间、结束){
    
    if(times循环属性是布尔属性

    当存在时,它指定音频将在每次结束时重新开始

    <!DOCTYPE html>
    <html>
    <body>
    
    <audio controls loop>
      <source src="horse.ogg" type="audio/ogg">
      <source src="horse.mp3" type="audio/mpeg">
    Your browser does not support the audio element.
    </audio>
    
    <p><strong>Note:</strong> The audio tag is not supported in Internet Explorer 8 and earlier versions.</p>
    
    </body>
    </html>
    
    
    

    你能用javascript播放声音吗,还是必须在HTML音频元素中播放?@scrblnrd3在可能的情况下,由于音轨播放结束和javascript重新启动itAFAIK之间的轻微延迟,它会导致音频中出现明显的点击。你无法访问html5
    音频
    标记原始数据。你可以通过ajax获取二进制blobnd使用,但它仍然是非常非常实验性的。当我研究这个API时,它只在Chrome Canary中受支持。是的,现在我对非常实验性很满意-我只想在浏览器中进行演示。顺便说一句,这是一篇好文章,谢谢。我建议使用node.js之类的东西,在这里合并流相当容易,相反试图找出一种如此新的技术(音频API),它甚至不能保证在不同的Chrome版本中都能使用相同的技术。我担心
    sound.play();
    是不同步的-因此只需播放一次声音。一个轻微的改进是添加
    else clearInterval(播放器)
    我觉得编写代码很有趣,所以我创建了一个存储库。实际上,这是我的第一个存储库。我会时不时地尝试使用它来进行改进。