【问题标题】:A-Frame - playing / pausing sound with a custom ('a-sound') sourceA-Frame - 使用自定义('a-sound')源播放/暂停声音
【发布时间】:2018-01-07 19:52:01
【问题描述】:

编辑 2:这是工作代码。非常感谢 Piotr 的帮助,如果没有你们,我不可能如此轻松地做到这一点。

sceneEl.querySelector('a-sound').setAttribute('sound', {src:url3}); 
      let playing = false;
      var el = document.querySelector('a-box');
      let audioEl = document.querySelector("a-sound");
      var audio = audioEl.components.sound;
      el.addEventListener('click', () => {
      if (!playing) {
      audio.playSound();
      } else {
      audio.stopSound();
      }
      playing = !playing;
      })


      } );
      request.send( null );
      }
      });

编辑:我已经从动态 URL(在我的 JSON 文件中)播放声音,但我似乎无法正确获取事件侦听器功能(用于播放/点击暂停)。

sceneEl.querySelector('a-sound').setAttribute('sound', {src:url3}); 
      let audioEl = document.querySelector("a-sound");
      let audio = audioEl.components.sound;
      sceneEl.querySelector('a-box').addEventListener('click', function () {
      if(!playing) {
          audio.play();
       } else {
          audio.pause();
          audio.currentTime = 0;
       }
       playing = !playing;
       });   
    } );
      request.send( null );
      }
      });

原文:我在 A-Frame 中使用 this 组件,但我希望从 ('a-sound') 实体中的 src 播放声音,而不是从资产链接播放声音。原因是我从 JSON 数组动态加载声音文件,因此它们不存在于任何资产列表中。我已经加载了所有文件,但是无法将此组件挂接到我加载的sceneEl.querySelector('a-sound').setAttribute('sound', {src:url3}); 代码中。我认为这只是一个小语法问题,但我不是 100% 确定。有人可以看一下这个并告诉我它是否可行吗?这是代码(除了 querySelector 中的 (a-sound) 之外,与链接相同。

       AFRAME.registerComponent('audiohandler', {
       init:function() {
       let playing = false;
       let audio = document.querySelector('a-sound');
       this.el.addEventListener('click', () => {
       if(!playing) {
          audio.play();
       } else {
          audio.pause();
          audio.currentTime = 0;
       }
       playing = !playing;
       });
       }
       })
    </script> 

【问题讨论】:

    标签: javascript audio aframe


    【解决方案1】:

    使用&lt;a-sound&gt; 你必须以不同的方式处理事情。

    播放/停止声音应在sound component 内完成。您需要通过yourEntityName.components.sound 访问它并使用playSound()stopSound() 方法。

    在我的glitch 上查看。我通过setAttribute() 设置源,并制作播放/停止按钮。


    我的&lt;a-sound&gt; 有一个几何形状作为按钮,但是您可以创建一个&lt;a-sound&gt; 实体,并像这样使用它:
    let audioEl = document.querySelector("a-sound");
    audioEl.setAttribute("src", "sourceURL");
    
    let audio = audioEl.components.sound;
    // play = audio.playSound();
    // stop = audio.stopSound():
    

    此外,节点未完全加载存在许多问题。看看这个例子:

    <a-entity component></a-entity>
    <a-sound></a-sound>
    

    如果组件试图获取对document.querySelector("a-sound").components.sound 的引用,它可能是未定义的。如果是这样,您应该尝试等到它发出loaded 信号。

    【讨论】:

    • 感谢您的提示。我已经应用了您的一些代码,并且可以使用该 audio.playSound() 从动态源播放声音;命令,但单击功能似乎不起作用。你能检查一下我编辑的帖子,看看你是否发现了问题?
    • 尝试使用 document.querySelector,而不是 sceneEl.querySelector。 sceneEl 没有在任何地方定义。此外,你的场景中只有一个盒子吗?
    • 是的,我现在只有一盒。我在组件的前面定义了 sceneEl。似乎 document.querySelector 也无法正常工作。如果它设置为自动播放,它就可以工作,所以我知道 URL 部分正在工作。有什么想法吗?
    • 和我的fiddle相似吗?当您在audiohandler 中执行init() 时,可能声音节点没有完全加载。尝试将&lt;a-sound&gt; 作为您的第一个实体(不好的解决方法,但如果可行,您可以尝试侦听loaded 事件,然后设置任何其他侦听器)
    • @DarioSilva 我已经更新了监听 a-sound 以加载jsfiddle.net/0wuLh0d4/4
    猜你喜欢
    • 1970-01-01
    • 2019-05-21
    • 2018-06-03
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多