我有一个有A-frame和AR.JS的网站,我可以在标记检测时播放音频。但是,当标记在视图中时,我会在控制台中不断弹出此警报。
'components audio warn All the sounds are playing. If you need to play more sounds simultaneously consider increasing the size of pool with the poolSize attribute. <a-entity sound="src: #sound" autoplay="false">'
似乎要求每一帧/几帧。关于如何阻止这个的任何想法?这似乎是不好的行为,特别是对于移动设备。
供参考,这是场景代码:
<a-scene embedded arjs='sourceType: webcam; debugUIEnabled: false;';>
<a-assets>
<audio id="sound" src="audio.mp3" preload="auto"></audio>
</a-assets>
<a-marker preset="custom" type="pattern" url="img/pattern-marker.patt">
<!--<a-marker preset="hiro">-->
<!--<a-torus-knot color="#000000" arc="180" p="2" q="7" radius="5" radius-tubular="0.1"></a-torus-knot>-->
<a-box position='0 0.5 0' material='color: black;' soundhandler>
</a-box>
</a-marker>
<a-entity sound="src: #sound" autoplay="false"></a-entity>
<a-entity camera></a-entity>
</a-scene>
以及注册组件和事件的代码:
AFRAME.registerComponent('soundhandler', {
tick: function () {
var entity = document.querySelector('[sound]');
if (document.querySelector('a-marker').object3D.visible == true) {
entity.components.sound.playSound();
} else {
}
}
});
答案 0 :(得分:1)
取决于你的目标:
1)您可以在播放声音之前通过检查currentTime
属性来检查HTML媒体元素是否正在播放。或者设置任何响应playing
和ended
音频元素事件的布尔变量。
2)只要标记不可见,您就可以pause()
音频。
答案 1 :(得分:1)
您可以使用标志变量并订阅声音事件:
AFRAME.registerComponent('soundhandler', {
playingSound = false, //flag vble.
soundToHandle = document.querySelector('[sound]'),
init: function() {
soundToHandle.stopSound = function() { //sound stoped event
playingSound = false;
};
soundToHandle.playSound = function() { //sound played event
playingSound = true;
};
},
tick: function () {
if ((document.querySelector('a-marker').object3D.visible == true) && (!playingSound)) {
soundToHandle.components.sound.playSound();
} else if ((document.querySelector('a-marker').object3D.visible == false) && (playingSound)){
soundToHandle.components.sound.stopSound();
}
}
});