HTML - 오디오 플레이어

안녕하세요, 웹 개발자 지망생 여러분! 오늘 우리는 HTML 오디오 플레이어의 흥미로운 세상으로 뛰어들어 보겠습니다. 이 튜토리얼이 끝나면 여러분은 자신만의 맞춤형 오디오 플레이어를 만들고 심지어 몇 가지 멋진 시각 효과를 추가할 수 있을 것입니다. 그럼 coding 모자를 쓰고 이 음악 여정을 시작해 보겠습니다!

HTML - Audio Player

HTML 로컬 오디오 플레이어 및 시각화기

HTML 오디오 기본

화려한 오디오 플레이어를 만들기 전에 기본 개념부터 시작해 보겠습니다. HTML5는 <audio> 요소를 도입하여 웹 페이지에 오디오를 추가하는 것을 아주 쉽게 만들었습니다. 다음은 간단한 예제입니다:

<audio controls>
<source src="your-audio-file.mp3" type="audio/mpeg">
Your browser does not support the audio element.
</audio>

이 코드에서:

  • <audio> 태그는 오디오 플레이어를 만듭니다.
  • controls 속성은 재생, 일시 정지, 볼륨 컨트롤을 추가합니다.
  • <source> 태그는 재생할 오디오 파일을 지정합니다.
  • <audio> 요소를 지원하지 않는 브라우저에 대한 대체 메시지를 포함합니다.

맞춤형 오디오 플레이어 만들기

이제 더 맞춤형 오디오 플레이어를 만들어 보겠습니다. HTML, CSS, 그리고 JavaScript를 사용하여 이를 구축할 것입니다:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Custom Audio Player</title>
<style>
#custom-player {
width: 300px;
padding: 20px;
background-color: #f0f0f0;
border-radius: 10px;
}
#play-pause-btn {
width: 100px;
height: 30px;
}
#seek-bar {
width: 100%;
margin-top: 10px;
}
</style>
</head>
<body>
<div id="custom-player">
<audio id="audio-element" src="your-audio-file.mp3"></audio>
<button id="play-pause-btn">Play</button>
<input type="range" id="seek-bar" value="0">
</div>

<script>
const audio = document.getElementById('audio-element');
const playPauseBtn = document.getElementById('play-pause-btn');
const seekBar = document.getElementById('seek-bar');

playPauseBtn.addEventListener('click', () => {
if (audio.paused) {
audio.play();
playPauseBtn.textContent = 'Pause';
} else {
audio.pause();
playPauseBtn.textContent = 'Play';
}
});

audio.addEventListener('timeupdate', () => {
const progress = (audio.currentTime / audio.duration) * 100;
seekBar.value = progress;
});

seekBar.addEventListener('input', () => {
const time = (seekBar.value / 100) * audio.duration;
audio.currentTime = time;
});
</script>
</body>
</html>

이를 분해해 보겠습니다:

  1. 우리는 맞춤형 플레이어의 컨테이너 <div>를 만듭니다.
  2. 안에 <audio> 요소(컨트롤이 없음), 재생/일시 정지 버튼, 그리고 seek 바를 넣습니다.
  3. JavaScript에서:
  • 버튼을 클릭할 때 재생/일시 정지를 토글합니다.
  • 오디오가 재생될 때 seek 바를 업데이트합니다.
  • seek 바를 클릭할 때 오디오의 재생 위치를 변경합니다.

시각화기 추가

이제 우리 플레이어에 간단한 시각화기를 추가하여 더 흥미롭게 만들어 보겠습니다. Web Audio API를 사용합니다:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Audio Player with Visualizer</title>
<style>
#custom-player {
width: 300px;
padding: 20px;
background-color: #f0f0f0;
border-radius: 10px;
}
#play-pause-btn {
width: 100px;
height: 30px;
}
#seek-bar {
width: 100%;
margin-top: 10px;
}
#visualizer {
width: 300px;
height: 150px;
background-color: #000;
margin-top: 10px;
}
</style>
</head>
<body>
<div id="custom-player">
<audio id="audio-element" src="your-audio-file.mp3"></audio>
<button id="play-pause-btn">Play</button>
<input type="range" id="seek-bar" value="0">
<canvas id="visualizer"></canvas>
</div>

<script>
const audio = document.getElementById('audio-element');
const playPauseBtn = document.getElementById('play-pause-btn');
const seekBar = document.getElementById('seek-bar');
const canvas = document.getElementById('visualizer');
const ctx = canvas.getContext('2d');

// 오디오 컨텍스트 설정
const audioContext = new (window.AudioContext || window.webkitAudioContext)();
const analyser = audioContext.createAnalyser();
const source = audioContext.createMediaElementSource(audio);
source.connect(analyser);
analyser.connect(audioContext.destination);

// 재생/일시 정지 기능
playPauseBtn.addEventListener('click', () => {
if (audioContext.state === 'suspended') {
audioContext.resume();
}
if (audio.paused) {
audio.play();
playPauseBtn.textContent = 'Pause';
} else {
audio.pause();
playPauseBtn.textContent = 'Play';
}
});

// seek 바 기능
audio.addEventListener('timeupdate', () => {
const progress = (audio.currentTime / audio.duration) * 100;
seekBar.value = progress;
});

seekBar.addEventListener('input', () => {
const time = (seekBar.value / 100) * audio.duration;
audio.currentTime = time;
});

// 시각화기
function drawVisualizer() {
requestAnimationFrame(drawVisualizer);

const bufferLength = analyser.frequencyBinCount;
const dataArray = new Uint8Array(bufferLength);
analyser.getByteFrequencyData(dataArray);

ctx.fillStyle = 'rgb(0, 0, 0)';
ctx.fillRect(0, 0, canvas.width, canvas.height);

const barWidth = (canvas.width / bufferLength) * 2.5;
let x = 0;

for (let i = 0; i < bufferLength; i++) {
const barHeight = dataArray[i] / 2;

ctx.fillStyle = `rgb(${barHeight + 100}, 50, 50)`;
ctx.fillRect(x, canvas.height - barHeight, barWidth, barHeight);

x += barWidth + 1;
}
}

drawVisualizer();
</script>
</body>
</html>

이 향상된 버전에서:

  1. 우리는 시각화기의 <canvas> 요소를 추가합니다.
  2. Web Audio API를 사용하여 오디오 컨텍스트와 분석기를 설정합니다.
  3. drawVisualizer 함수는 오디오 주파수 데이터를 사용하여 바 그래프 시각화를 만듭니다.

로컬 오디오 플레이어와 플레이리스트

이제 여러 트랙을 처리할 수 있는 플레이어를 만들어 보겠습니다:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Audio Player with Playlist</title>
<style>
#playlist-player {
width: 300px;
padding: 20px;
background-color: #f0f0f0;
border-radius: 10px;
}
#play-pause-btn, #prev-btn, #next-btn {
width: 80px;
height: 30px;
margin: 5px;
}
#seek-bar {
width: 100%;
margin-top: 10px;
}
#playlist {
list-style-type: none;
padding: 0;
}
#playlist li {
cursor: pointer;
padding: 5px;
}
#playlist li:hover {
background-color: #ddd;
}
</style>
</head>
<body>
<div id="playlist-player">
<audio id="audio-element"></audio>
<button id="prev-btn">Previous</button>
<button id="play-pause-btn">Play</button>
<button id="next-btn">Next</button>
<input type="range" id="seek-bar" value="0">
<ul id="playlist">
<li data-src="song1.mp3">Song 1</li>
<li data-src="song2.mp3">Song 2</li>
<li data-src="song3.mp3">Song 3</li>
</ul>
</div>

<script>
const audio = document.getElementById('audio-element');
const playPauseBtn = document.getElementById('play-pause-btn');
const prevBtn = document.getElementById('prev-btn');
const nextBtn = document.getElementById('next-btn');
const seekBar = document.getElementById('seek-bar');
const playlist = document.getElementById('playlist');
let currentTrack = 0;

function loadTrack(index) {
const tracks = playlist.getElementsByTagName('li');
if (index >= 0 && index < tracks.length) {
currentTrack = index;
audio.src = tracks[currentTrack].getAttribute('data-src');
audio.load();
playPauseBtn.textContent = 'Play';
}
}

function playPause() {
if (audio.paused) {
audio.play();
playPauseBtn.textContent = 'Pause';
} else {
audio.pause();
playPauseBtn.textContent = 'Play';
}
}

playPauseBtn.addEventListener('click', playPause);

prevBtn.addEventListener('click', () => {
loadTrack(currentTrack - 1);
});

nextBtn.addEventListener('click', () => {
loadTrack(currentTrack + 1);
});

audio.addEventListener('timeupdate', () => {
const progress = (audio.currentTime / audio.duration) * 100;
seekBar.value = progress;
});

seekBar.addEventListener('input', () => {
const time = (seekBar.value / 100) * audio.duration;
audio.currentTime = time;
});

playlist.addEventListener('click', (e) => {
if (e.target.tagName === 'LI') {
const tracks = playlist.getElementsByTagName('li');
loadTrack([...tracks].indexOf(e.target));
playPause();
}
});

loadTrack(0);
</script>
</body>
</html>

이 플레이리스트 버전에서:

  1. 우리는 트랙 목록을 사용하는 무序列表를 만듭니다.
  2. 이전 및 다음 버튼을 추가합니다.
  3. JavaScript는 트랙 로드, 재생/일시 정지, 트랙 이동을 처리합니다.

오디오 플레이어 메서드

다음은 일반적인 오디오 플레이어 메서드와 설명입니다:

메서드 설명
play() 오디오 재생 시작
pause() 오디오 일시 정지
load() 오디오 요소 재로드
currentTime 현재 재생 위치(초) 가져오기/설정
duration 오디오 전체 길이(초) 가져오기
volume 볼륨(0.0에서 1.0 사이) 가져오기/설정
muted 오디오 음소거 여부 가져오기/설정
playbackRate 재생 속도 가져오기/설정

이제 여러분은 기본 및 고급 HTML 오디오 플레이어, 시각화기, 그리고 플레이리스트를 만드는 방법을 배웠습니다. 연습이 완벽함을 기억하며, 여러분의 필요에 맞게 이 예제를 실험하고 맞춤화해 보세요. 행복한 코딩 되세요, 그리고 여러분의 웹 페이지가 아름다운 음악으로 가득 차길 바랍니다!

Credits: Image by storyset