Javascript with Audio
In this tutorial, we will look at how to include and manipulate audio in HTML and javascript. Audio files are included in HTML like below:
<audio> <source src="audio/1.mp3" type="audio/mpeg"> </audio>
Types of audio formats:
- mp3: type="audio/mpeg"
- wav: type="audio/wav"
- ogg: type="audio/ogg"
Attributes
Attributes of the audio tag are written inside of the opening tag of the <audio> element, as shown below.
<audio autoplay controls loop muted preload> <source src="audio/1.mp3" type="audio/mpeg"> </audio>
- autoplay: immediately play the audio file upload loading of the website
- controls: show audio controls
- loop: loop the playing of audio file
- muted: start audio file on mute
- preload: preload the audio file before playing
Methods
- play()
- pause()
<audio autoplay id="bgm"> <source src="audio/1.mp3" type="audio/mpeg"> </audio>
document.getElementById('bgm').play();
document.getElementById('bgm').pause();
Properties
- currentTime: Set or return playback position of audio (in seconds)
- duration: Return duration of audio source (in seconds)
- ended: Return (true or false) whether audio playback has ended
- loop: Set or return whether audio is on loop
- muted: Set or return whether audio is on mute
- paused: Return whether audio is paused
- playbackRate: Set or return speed of audio playback
- played: Return whether audio has been played
- src: Set or return audio source
- volume: Set or return volume of audio
Events
Below is a list of events to be used as HTML attributes for <audio> tag:
- oncanplaythrough: fires when browser is ready to play the audio file all the way through without buffering
- onended: fires when the audio file finishes playing
- onpause: fires when the audio player is paused
- onplay: fires when the audio player is set to play
- onratechange: fires when the playback rate changes
- onseeking: fires when the user is seaking to a new position of the audio playback
- ontimeupdate: fires when the playback position changes (when the audio file is playing)
- onvolumechange: fires when the volume of playback changes
Link to full reference of audio methods, properties and events.
Demo: Simple Audio Player
Click to view it as a full web page.
HTML:
<audio onratechange="updateRate()" onvolumechange="updateVol()" ontimeupdate="updateTime()" id="bg" loop preload="auto"> <source src="audio/1.mp3" type="audio/mpeg"> </audio> <div onclick="changeRate()" id="rateDiv"><h1 id="rateDisplay">Playback Rate:<br><span id="rateVal">1</span></h1></div> <div onclick="changeVol()" id="volDiv"><h1 id="volDisplay">Volume:<br><span id="volVal">1</span></h1></div> <div onclick="changeTime()" id="timeDiv"><h1 id="timeDisplay">Time:<br><span id="timeVal">0</span></h1></div> <div id="player"> <div id="pb-time"></div> <div id="play" onclick="playAudio()"><span id="play-text">PLAY</span></div> <div id="pause" onclick="pauseAudio()"><span id="pause-text">PAUSE</span></div> <div id="stop" onclick="stopAudio()"><span id="stop-text">STOP</span></div> </div>
CSS:
body, html{ height: 100%; font-family: Helvetica, 'sans-serif'; margin: 0; } #rateDiv, #volDiv, #timeDiv{ width: calc(100% / 3); height: 100%; float: left; } #rateDiv{ background-color: rgb(255, 0, 0); } #volDiv{ background-color: rgb(255, 255, 0); } #timeDiv{ background-color: rgb(0, 0, 255); } #player{ width: 100%; height: 12.5%; position: fixed; right: 0; bottom: 0; background-color: lightyellow; text-align: center; } #play, #pause, #stop{ display: inline-block; } #play-text, #pause-text, #stop-text{ line-height: 12.5vh; font-size: 1.5em; } #play-text:hover, #pause-text:hover, #stop-text:hover{ font-style: italic; font-weight: bold; background-color: black; color: white; } #play-text, #pause-text{ margin-right: 2em; } #pb-time{ width: 25px; height: 25px; background-color: black; border-radius: 50%; position: fixed; bottom: calc(12.5% - 12.5px); }
Javascript:
var bg = document.getElementById('bg'); function playAudio() { bg.play(); } function pauseAudio(){ bg.pause(); } function stopAudio() { bg.pause(); bg.currentTime = 0; } function changeRate(){ var rate = (event.clientY / window.innerHeight) * 4.75 + 0.25; bg.playbackRate = rate; } function changeVol(){ var vol = event.clientY / window.innerHeight; bg.volume = vol; } function changeTime(){ var time = (event.clientY / window.innerHeight) * bg.duration; bg.currentTime = time; } function updateRate(){ document.getElementById('rateVal').innerHTML = bg.playbackRate; var blueVal = parseInt(bg.playbackRate * 51); document.getElementById('rateDiv').style.backgroundColor = "rgb(255, 0, " + blueVal + ")"; } function updateVol(){ document.getElementById('volVal').innerHTML = bg.volume; var redVal = parseInt(bg.volume * 255); document.getElementById('volDiv').style.backgroundColor = "rgb(" + redVal + ", 255, 0)"; } function updateTime(){ document.getElementById('timeVal').innerHTML = bg.currentTime; var greenVal = parseInt(bg.currentTime / bg.duration * 255); document.getElementById('timeDiv').style.backgroundColor = "rgb(0, " + greenVal + ", 255)"; var leftVal = (bg.currentTime / bg.duration) * window.innerWidth; document.getElementById('pb-time').style.left = leftVal + "px"; }