我正在用HTML5和Javascript制作游戏。
如何通过Javascript播放游戏音频?
我正在用HTML5和Javascript制作游戏。
如何通过Javascript播放游戏音频?
Answers:
如果您不想弄乱HTML元素:
var audio = new Audio('audio_file.mp3');
audio.play();
这使用了HTMLAudioElement
接口,该接口以与<audio>
element相同的方式播放音频。
如果需要更多功能,我使用了howler.js库,发现它简单实用。
很简单,只需获取您的audio
元素并调用play()
方法:
document.getElementById('yourAudioTag').play();
看看这个例子:http : //www.storiesinflight.com/html5/audio.html
本网站揭示的其他一些很酷的事情可以做,比如load()
,pause()
和几个其他属性audio
的元素。
http://www.schillmania.com/projects/soundmanager2/
SoundManager 2提供了易于使用的API,该API允许在任何现代浏览器(包括IE 6+)中播放声音。如果浏览器不支持HTML5,则它将从Flash获得帮助。如果您要严格使用HTML5而不使用Flash,则可以进行设置,preferFlash=false
它在iPad,iPhone(iOS4)和其他支持HTML5的设备+浏览器上支持100%无Flash音频
使用非常简单:
<script src="soundmanager2.js"></script>
<script>
// where to find flash SWFs, if needed...
soundManager.url = '/path/to/swf-files/';
soundManager.onready(function() {
soundManager.createSound({
id: 'mySound',
url: '/path/to/an.mp3'
});
// ...and play it
soundManager.play('mySound');
});
</script>
这是实际的演示:http : //www.schillmania.com/projects/soundmanager2/demo/christmas-lights/
这是一个很老的问题,但我想添加一些有用的信息。话题开始者提到他是"making a game"
。因此对于每个需要音频进行游戏开发的人来说,有一个更好的选择,不仅仅是<audio>
标签或标签HTMLAudioElement
。我认为您应该考虑使用Web Audio API:
尽管网络音频不再需要插件,但音频标签为实现复杂的游戏和交互式应用程序带来了明显的限制。Web Audio API是用于处理和合成Web应用程序中音频的高级JavaScript API。该API的目标是包括现代游戏音频引擎中的功能以及现代桌面音频制作应用程序中的某些混合,处理和过滤任务。
使用jQuery轻松
//设置没有预加载的音频标签
<audio class="my_audio" controls preload="none">
<source src="audio/my_song.mp3" type="audio/mpeg">
<source src="audio/my_song.ogg" type="audio/ogg">
</audio>
//添加要加载的jQuery
$(".my_audio").trigger('load');
//编写播放和停止的方法
function play_audio(task) {
if(task == 'play'){
$(".my_audio").trigger('play');
}
if(task == 'stop'){
$(".my_audio").trigger('pause');
$(".my_audio").prop("currentTime",0);
}
}
//决定如何控制音频
<button onclick="play_audio('play')">PLAY</button>
<button onclick="play_audio('stop')">STOP</button>
编辑
为了解决@stomy的问题,这是如何使用这种方法播放播放列表:
将歌曲设置在一个对象中:
playlist = {
'song_1' : 'audio/splat.mp3',
'song_2' : 'audio/saw.mp3',
'song_3' : 'audio/marbles.mp3',
'song_4' : 'audio/seagulls.mp3',
'song_5' : 'audio/plane.mp3'
}
像以前一样使用触发和播放功能:
$(".my_audio").trigger('load');
function play_audio(task) {
if(task == 'play'){
$(".my_audio").trigger('play');
}
if(task == 'stop'){
$(".my_audio").trigger('pause');
$(".my_audio").prop("currentTime",0);
}
}
动态加载第一首歌曲:
keys = Object.keys(playlist);
$('.my_audio').append("<source id='sound_src' src=" + playlist[keys[0]] + " type='audio/mpeg'>");
当前歌曲结束时,将音频源重置为播放列表中的下一首歌曲:
count = 0;
$('.my_audio').on('ended', function() {
count++;
$("#sound_src").attr("src", playlist[keys[count]])[0];
$(".my_audio").trigger('load');
play_audio('play');
});
请参见此处,以获取此代码的实际示例。
ended
要发出的事件并启动列表中的下一个音频文件(大概是在DOM,JS内存等中保持跟踪) )。developer.mozilla.org/en-US/docs/Web/Events/ended
如果出现以下错误:
未捕获(承诺)的DOMException:play()失败,因为用户没有首先与文档进行交互。
这意味着用户需要首先与网站进行交互(如错误消息所示)。在这种情况下,您需要使用click
或仅使用另一个事件侦听器,以便用户可以与您的网站进行交互。
如果您要自动加载音频并且不希望用户首先与文档进行交互,则可以使用setTimeout
。
setTimeout(() => {
document.getElementById('mySound').play();
}, 500)
<audio id="mySound" src="sound.mp3"></audio>
声音将在0.5秒后开始。
我遇到了一些与音频答应对象返回有关的问题,还有一些与用户与声音交互的问题有关,最终我使用了这个小对象,
我建议实现最接近用户正在使用的交互事件的播放声音。
var soundPlayer = {
audio: null,
muted: false,
playing: false,
_ppromis: null,
puse: function () {
this.audio.pause();
},
play: function (file) {
if (this.muted) {
return false;
}
if (!this.audio && this.playing === false) {
this.audio = new Audio(file);
this._ppromis = this.audio.play();
this.playing = true;
if (this._ppromis !== undefined) {
this._ppromis.then(function () {
soundPlayer.playing = false;
});
}
} else if (!this.playing) {
this.playing = true;
this.audio.src = file;
this._ppromis = soundPlayer.audio.play();
this._ppromis.then(function () {
soundPlayer.playing = false;
});
}
}
};
并实现如下:
<button onclick="soundPlayer.play('https://interactive-examples.mdn.mozilla.net/media/examples/t-rex-roar.mp3');">Play</button>
我用这种方法播放声音...
var audioElement;
if(!audioElement) {
audioElement = document.createElement('audio');
audioElement.innerHTML = '<source src="' + '/audio/sound.mp3'+ '" type="audio/mpeg" />'
}
audioElement.play();
如果您想在打开页面时播放音频,请这样做。
<script>
function playMusic(){
music.play();
}
</script>
<html>
<audio id="music" loop src="sounds/music.wav" autoplay> </audio>
</html>
并在游戏代码中需要时调用此playMusic()。
基于安全性要求,用户必须与网页互动才能获得音频,这是我基于阅读许多文章(包括本网站上的文章)时所做的操作
由于所有音频文件都已在同一OnClick上“播放”,因此您现在可以在游戏中随时播放它们而不受限制
请注意,为了获得最佳兼容性,请不要使用wav文件,MS则不支持它们
使用涵盖所有设备的mp3和ogg
例:
<audio id="welcome">
<source src="URL/welcome.ogg" type="audio/ogg">
<source src="URL/welcome.mp3" type="audio/mpeg">
Your browser does not support the audio element.
</audio>
根据需要重复游戏中的所有音频
然后:
document.getElementById("welcome").play();
document.getElementById("welcome").pause();
根据需要重复播放,但不要在游戏开始时暂停要收听的音频
您可以使用Web Audio API播放声音。那里有相当多的音频库,例如howler.js,soundjs等。如果您不担心旧的浏览器,则还可以在http://musquitojs.com/上进行检查。它提供了一个简单的API来创建和播放声音。
例如,播放声音,您要做的就是。
import $buzz from 'musquito';
const buzz = $buzz('gunfire.mp3');
buzz.play();
该库还支持音频精灵。
这是我在一个婴儿AI项目中想出的一些JS。我希望这能够为您提供帮助。
<!DOCTYPE html>
<html>
<head>
<title>
js prompt AI
</title>
<style>
#button {
border: 1px solid black;
border-radius: 10px;
font-size: 22px;
height:65px;
width:100px;
text-align: center;
line-height: 65px;
}
</style>
</head>
<body>
<audio id="myAudio" src="./how_are_you.m4a"></audio>
<p>To Interact with the AI please click the button</p>
<div id=button>click</div>
<script>
var button = document.getElementById("button");
function playBack() {
button.addEventListener("click", function (){
var talk = prompt("If you wish for the AI to respond type hi");
var myAudio = document.getElementById("myAudio");
if(talk === "hi") {
myAudio.play();
}
}) ;
}
playBack();
</script>
</body>
</html>
只需使用此:
<video controls="" autoplay="" name="media"><source src="Sound URL Here" type="audio/mpeg" /></video>
或者,使其更简单:
<video controls="" autoplay="" name="media">
<source src="Sound URL Here" type="audio/mpeg" />
</video>
样品:
<video controls="" autoplay="" name="media">
<source src="https://interactive-examples.mdn.mozilla.net/media/examples/t-rex-roar.mp3" type="audio/mpeg">
</video>
如果Chrome 73以外的其他浏览器都可以使用,则没有任何想法!!
我在播放音频时遇到了一些问题,尤其是因为Chrome浏览器已更新,用户必须先与文档进行交互。
但是,在几乎所有解决方案中,我发现JS代码都必须主动设置侦听器(例如,单击按钮)以接收用户事件以播放音频。
就我而言,我只是想让我的游戏在玩家与BGM互动后立即玩,所以我使自己成为一个简单的侦听器,可以不断检查网页是否在互动。
const stopAttempt = setInterval(() => {
const audio = new Audio('your_audio_url_or_file_name.mp3');
const playPromise = audio.play();
if (playPromise) {
playPromise.then(() => {
clearInterval(stopAttempt)
}).catch(e=>{
console.log('' + e);
})
}
}, 100 )
<audio>
。该元素将具有用于“播放”,“暂停”等的适当JS钩子……