๐ ๋ค์ด๊ฐ๋ฉฐ
์๋ ํ์ธ์. ์ค๋์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฒํผ ํด๋ฆญ์ผ๋ก ์ค๋์ค๋ฅผ ์ ์ดํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์ ๋ฆฌํ๋ ค๊ณ ํฉ๋๋ค.
๋ฒํผ ํด๋ฆญ์ผ๋ก ์์ ์ ์ผ๊ณ ๋๊ณ , ๋ค์ ์์ ์ผ๋ก ๋๊ธฐ๋ ์ฌ๋ฌ ์์ ์ ์ ์ดํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉด์ HTML์๋ audioํ๊ทธ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ์ค์ง ์๋ฐ์คํฌ๋ฆฝํธ์์๋ง audio ์ ์ด๋ฅผ ํ๋ค๊ฐ ๋งํ์ง๋ง, ๊ฒฐ๊ตญ ์ ํด๊ฒฐ์ ํด์ ๋ฐ๋ก ์ ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
์์ฃผ ๊ฐ๋จํ ์๋ฅผ ๋ค์ด์,
const audio = new Audio('audio_file.mp3');
audio.play();
HTML์ ๋ฐ๋ก ์ค๋์ค ํ๊ทธ๋ฅผ ์์ฑํ์ง ์๊ณ ์ด๋ฐ ์์ผ๋ก audio ์ฝ๋ฉ์ ํด์ ๋ก์ปฌ์์ ์ ์๋ํ๋ ๊ฒ์ ํ์ธํ๊ณ ,
๊นํ๋ธ ํผ๋ธ๋ฆฌ์ฑ์ ํ์ฌ ์ฌ์ดํธ๋ก ๋ฐฐํฌํ๋๊น ์๋์ ๊ฐ์ ์ค๋ฅ๋ก ์ค๋์ค ์ฌ์์ด ์๋ํ์ง ์๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.
Uncaugth (in promise) DOMException: Failed to load because no supported source was found.
๊ทธ๋์ ๊ตฌ๊ธ๋ง์ ํตํด ์์๋ณธ ๊ฒฐ๊ณผ
stackoverflow.com/questions/10792163/change-audio-src-with-javascript
์์ ๋งํฌ์ ๋์์๋ ํด๊ฒฐ์ฑ ์ ์์ฉํด์ HTML์ <audio> ํ๊ทธ๋ฅผ ์์ฑํ๊ณ <audio> ํ๊ทธ ์์ <source > ํ๊ทธ๋ฅผ ์์ฑํ์ฌ <source> ํ๊ทธ์ src ์์ฑ์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ณ๊ฒฝํด ์ฃผ๋ ๋ฐฉ์์ผ๋ก ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์์ต๋๋ค.
๊ทธ๋ผ ์ด์ ๋ฒํผ์ ํด๋ฆญ์ผ๋ก audio๋ฅผ ์ผ๊ณ ๋๊ณ , ๋ค์ audio๋ก ๋๊ธฐ๋ ๋ฐฉ๋ฒ๊น์ง ๊ฐ๋จํ ์์ ๋ฅผ ํตํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
1. ํ์ผ ๊ตฌ์ฑ
๋จผ์ ํ์ผ ๊ตฌ์ฑ์ ์๋์ ๊ฐ์ด ๊ตฌ์ฑํ์์ต๋๋ค.
2. HTML
HTML ๊ตฌ์ฑ์ ๋๋ค.
<html>
<head>
<title>audio play example</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<audio id="audioContainer"> <!-- audio play๋ฅผ ์ํจ -->
<source id="audioSource" src="" /> <!-- audio ํ์ผ -->
Your browser does not support the audio format.
</audio>
<div class="js-onOffWrap">
<button class="js-playBtn">โฌ Play Music</button>
<button class="js-stopBtn">โฌ Stop Music</button>
</div>
<div class="js-audioNextBtn">โฏ</div>
<script src="script.js"></script>
</body>
</html>
์๋ฐ์คํฌ๋ฆฝํธ์์ audio play๋ฅผ ์ํ <audio> ํ๊ทธ๋ฅผ ์์ฑํ๊ณ <audio> ํ๊ทธ ์์ <source> ํ๊ทธ๋ฅผ ์์ฑํจ์ผ๋ก์จ ์๋ฐ์คํฌ๋ฆฝํธ์์ <source> ํ๊ทธ์ src ์์ฑ์ ๋ณ๊ฒฝํด์ค์ผ๋ก audio๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋์์ต๋๋ค.
๊ทธ ์ธ์๋ audio ์ฌ์๊ณผ, ์ ์ง, ๋ค์ audio๋ก ๋๊ธฐ๋ ๋ฒํผ๋ค์ ๋๋ค.
3. JavaScript
๋จผ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ ์ฒด์ ์ธ ์ฝ๋์ ๋๋ค.
๋ถ๋ถ ๋ถ๋ถ ์ฝ๋๋ฅผ ํด์ํด ๊ฐ๋ฉด์ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
const audioContainer = document.querySelector('#audioContainer');
const playBtn = document.querySelector('.js-playBtn');
const stopBtn = document.querySelector('.js-stopBtn')
const audioNextBtn = document.querySelector('.js-audioNextBtn');
const MUSIC_COUNT = 3; // ์์
๊ฐฏ์
let currentAudio = 1; // ํ์ฌ ์์
function playAudio() {
audioContainer.volume = 0.2;
audioContainer.loop = true;
audioContainer.play();
}
function stopAudio() {
audioContainer.pause();
}
function loadAudio() {
const source = document.querySelector('#audioSource');
source.src = `audio/${currentAudio}.mp3`;
audioContainer.load();
playAudio();
}
function handleNextButtonClick() {
if (currentAudio < MUSIC_COUNT) {
currentAudio += 1;
} else {
currentAudio = 1;
}
audioContainer.pause();
loadAudio();
}
playBtn.addEventListener('click', loadAudio);
stopBtn.addEventListener('click', stopAudio);
audioNextBtn.addEventListener('click', handleNextButtonClick);
3.1 DOM
๊ทธ๋ผ ๋จผ์ DOM ๋ถ๋ถ๋ถํฐ ๊ฐ๋จํ๊ฒ ์ง๊ณ ๊ฐ๊ฒ ์ต๋๋ค.
const audioContainer = document.querySelector('#audioContainer'); //HTML์์ <audio> ํ๊ทธ
const playBtn = document.querySelector('.js-playBtn'); // play ๋ฒํผ
const stopBtn = document.querySelector('.js-stopBtn') // stop ๋ฒํผ
const audioNextBtn = document.querySelector('.js-audioNextBtn'); // next ๋ฒํผ
3.2 Button Event
๊ฐ๊ฐ์ ๋ฒํผ์ click ํ๋ฉด ์๋ํ๊ฒ ํด์ผํ๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ์ ๋ฒํผ๋ค์ click ์ด๋ฒคํธ๋ฅผ ์ฃผ์์ต๋๋ค.
playBtn.addEventListener('click', loadAudio);
audioNextBtn.addEventListener('click', handleNextButtonClick);
stopBtn.addEventListener('click', stopAudio);
3.3 function loadAudio()
๋ค์์ผ๋ก ๋จผ์ playBtn click ์ ํธ์ถํ๋ loadAudio ํจ์์ ๋ํด์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
function loadAudio() {
const source = document.querySelector('#audioSource');
source.src = `audio/${currentAudio}.mp3`;
audioContainer.load();
playAudio();
}
HTML์์ <audio> ํ๊ทธ ์์ ์๋ <source> ํ๊ทธ๋ฅผ DOM ์์ const source๋ก ์ก์์ฃผ๊ณ source์ src ๊ฒฝ๋ก๋ฅผ `` ๋ฐฑ ํฑ ํ๊ทธ๋ฅผ ์ด์ฉํด์ audioํ์ผ ์์ ์๋ ${currentAudio}๋ ์์์ 1๋ก ์ด๊ธฐ ๊ฐ์ ์ฃผ์ด์ audioํด๋ ์์ 1.mp3 ํ์ผ์ด src๊ฒฝ๋ก์ ๋ด๊ธฐ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฌ๊ณ ๋์ HTML์ <audio> ํ๊ทธ๋ฅผ DOM ์์๋ก ์ก์ audioContainer๋ฅผ load() ํด์ ๋ถ๋ฌ์ค๊ฒ ๋ฉ๋๋ค.
load ํ๊ณ ๋๋ฉด ์ด์ load ํ audio๋ฅผ ์คํ์ํค๋ playAudio() ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋ฉ๋๋ค.
3.4 function playAudio()
function playAudio() {
audioContainer.volume = 0.2;
audioContainer.loop = true;
audioContainer.play();
}
.volume์ audio์ ๋ณผ๋ฅจ ํฌ๊ธฐ๋ฅผ ์ค์ ํฉ๋๋ค ๋ณผ๋ฅจ ํฌ๊ธฐ๋ 0 ~ 1๊น์ง ์ค์ ํ ์ ์์ต๋๋ค.
.loop ์ ์ด audio๋ฅผ ๋ฐ๋ณต ์ฌ์ํ ๊ฑด์ง ์ค์ ํฉ๋๋ค. true = ๋ฐ๋ณต ์ฌ์, false = ๋ฐ๋ณต ์ฌ์ํ์ง ์์
๊ทธ๋ฆฌ๊ณ .play()๋ฅผ ํด์ฃผ๊ฒ ๋๋ฉด audio, ์์ ์ด ์ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
audio์ ๋ ๋ง์ ์ฌ๋ฌ ์์ฑ์ MDN์์ ํ์ธํด ๋ณด์ค ์ ์์ต๋๋ค.
developer.mozilla.org/ko/docs/Web/HTML/Element/audio#%ED%8A%B9%EC%84%B1
3.5 function handleNextButtonClick()
์ด ํจ์๋ audioNextBtn click ์ด๋ฒคํธ ๋ฐ์ ์ ๋ค์ ์์ ์ผ๋ก ๋๊ธฐ๋ ๊ธฐ๋ฅ์ ํ๋ ํจ์์ ๋๋ค.
function handleNextButtonClick() {
if (currentAudio < MUSIC_COUNT) {
currentAudio += 1;
} else {
currentAudio = 1;
}
audioContainer.pause();
loadAudio();
}
๋จผ์ ํจ์ ๋ด์์๋ ์กฐ๊ฑด๋ฌธ์ ํตํด์ ํจ์๊ฐ ์คํ๋๋ฉด ํ์ฌ audio ์์๊ฐ ์ ์ฒด audio ๊ฐ์๋ณด๋ค ์ ์ผ๋ฉด ์ ์ญ ๋ณ์๋ก ์์ฑํ currentAudio +1์ ํด์ฃผ๊ณ ์๋๋ฉด 1๋ก ๋ฐ๊ฟ์ฃผ๋ฉด์ ์ฒ์ audio๋ก ๋๋์๊ฐ๊ฒ๋ ์์ฑํ๊ณ ,
ํ์ฌ ์ฌ์๋๊ณ ์๋ audio๋ฅผ ์ ์ง์ํค๊ณ loadAudio ํจ์๋ฅผ ์คํ๋๋๋ก ํ์ต๋๋ค.
๊ทธ๋ฌ๋ฉด ์ฒ์ next ๋ฒํผ์ ํด๋ฆญํ๋ค๋ ๊ฐ์ ํ์ currentAudio๋ 2๊ฐ ๋ ๊ฒ์ด๊ณ ,
loadAudio ํจ์์์๋ ์์์ ์ค๋ช ํ๋ฏ์ด curruntAudio ๋ณ์๋ฅผ ํ์ฉํด์ 2.mp3๋ฅผ ๋ถ๋ฌ์ค๊ฒ ๋๋ ๊ฒ์ ๋๋ค.
3.6 function stopAudio()
stopBtn์ click ์ด๋ฒคํธ ๋ฐ์ ์ audio๋ฅผ ์ค๋จ์ํค๋ ํจ์์ ๋๋ค.
function stopAudio() {
audioContainer.pause();
}
ํ ์ค ๋ฐ์ ๋์ง ์์ง๋ง ์ด๋ค ๊ธฐ๋ฅ์ ํ๋์ง ๋ณด๊ธฐ ์ข๊ฒ ํ๊ธฐ ์ํด์ ํจ์๋ก ์์ฑํ ๊ฒ์ ๋๋ค.
.pause() ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด play ํ๊ณ ์๋ audio๋ฅผ ์ค์งํ๊ฒ ๋ฉ๋๋ค.
๐ ๋ง๋ฌด๋ฆฌ
์ ์ฒด์ ์ธ ์ฝ๋๋ฅผ Repl ์ฌ์ดํธ์ ์ฌ๋ ค๋๊ฒ ์ต๋๋ค.
์ฝ๋๋ฅผ ์คํํ์๋ ค๋ฉด ๊ฐ์ด๋ฐ ์๋จ ์ชฝ์ Run ๋ฒํผ์ ํด๋ฆญํ์๋ฉด ๋ฉ๋๋ค.
์ด๋ ๊ฒ HTML์์ <audio> ํ๊ทธ์ <source> ํ๊ทธ๋ฅผ ์ด์ฉํด์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ฑํ๋๊น ๋ฒํผ ํด๋ฆญ์ผ๋ก audio ์์ ์ ์ฌ์ํ๊ณ , ์ ์งํ๊ณ , ๋๊ธฐ๋ ๊ธฐ๋ฅ ๊ตฌํ์ด ๋ก์ปฌ๊ณผ ๊น ํ๋ธ ํผ๋ธ๋ฆฌ์ฑ ์ดํ์๋ audio๊ฐ ์ ์๋ํ๋ ๊ฒ์ ํ์ธํ์ต๋๋ค!
์ง์ ์ฝ๋๋ฅผ ์ดํด๋ณด์๊ณ ์คํ๋ ํด๋ณด๋ฉด์ ์์ฉ๋ ํ์๊ณ ์กฐ๊ธ์ด๋๋ง ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.