JavaScript 오디오와 비디오 API: 웹에서 미디어 다루기 🎵🎬

콘텐츠 대표 이미지 - JavaScript 오디오와 비디오 API: 웹에서 미디어 다루기 🎵🎬

 

 

안녕하세요, 여러분! 오늘은 JavaScript의 초쿨한 기능 중 하나인 오디오와 비디오 API에 대해 알아볼 거예요. 이 기능들을 마스터하면 여러분도 웹에서 미디어를 다루는 진정한 프로 개발자가 될 수 있답니다! 😎 재능넷에서도 이런 스킬을 가진 개발자들의 수요가 엄청나죠. 그럼 지금부터 시작해볼까요? 레츠고~! 🚀

1. JavaScript 오디오 API: 소리의 세계로 빠져볼까요? 🎧

JavaScript 오디오 API는 웹 페이지에서 소리를 재생하고 조작할 수 있게 해주는 강력한 도구예요. 음악 플레이어부터 게임 효과음까지, 이 API로 할 수 있는 건 정말 무궁무진하답니다!

1.1 Audio 객체 생성하기

먼저, Audio 객체를 만들어볼까요? 이게 바로 모든 것의 시작이에요!


const myAudio = new Audio('awesome_song.mp3');
  

이렇게 하면 'awesome_song.mp3'라는 파일을 재생할 준비가 된 Audio 객체가 생성돼요. 쉽죠? ㅋㅋㅋ

1.2 오디오 재생하기

자, 이제 우리가 만든 오디오를 재생해볼 차례예요!


myAudio.play();
  

와우! 이 한 줄로 음악이 재생되기 시작했어요. 너무 쉽지 않나요? 😆

1.3 오디오 일시정지와 정지

음악을 멈추고 싶을 때는 어떻게 할까요? 두 가지 방법이 있어요.


// 일시정지
myAudio.pause();

// 완전 정지 (처음으로 돌아가기)
myAudio.pause();
myAudio.currentTime = 0;
  

일시정지는 현재 위치에서 멈추고, 완전 정지는 처음으로 돌아가는 거예요. 상황에 따라 적절히 사용하면 되겠죠?

1.4 볼륨 조절하기

볼륨 조절도 할 수 있어요. 귀가 아플 정도로 크게 들을 수도 있고, 속삭이는 소리처럼 작게 들을 수도 있죠.


// 볼륨 설정 (0.0 ~ 1.0 사이의 값)
myAudio.volume = 0.5; // 50% 볼륨

// 볼륨 높이기
myAudio.volume += 0.1;

// 볼륨 낮추기
myAudio.volume -= 0.1;
  

볼륨 값은 0.0(무음)부터 1.0(최대 볼륨) 사이의 값을 가져요. 0.5는 딱 중간 볼륨이죠!

1.5 재생 속도 조절하기

음악을 빠르게 또는 느리게 재생하고 싶나요? 그것도 가능해요!


// 재생 속도 설정
myAudio.playbackRate = 1.5; // 1.5배 빠르게
myAudio.playbackRate = 0.5; // 0.5배 느리게
  

1.0이 기본 속도예요. 2.0은 두 배 빠르게, 0.5는 절반 속도로 재생되는 거죠. 치파오 노래를 들으면서 속도 조절해보면 재밌을 것 같지 않나요? ㅋㅋㅋ

1.6 반복 재생 설정하기

좋아하는 노래를 계속 반복해서 듣고 싶다구요? 그것도 문제없어요!


myAudio.loop = true; // 반복 재생 켜기
myAudio.loop = false; // 반복 재생 끄기
  

이렇게 하면 노래가 끝나도 자동으로 다시 시작돼요. 무한 반복! 🔁

1.7 오디오 이벤트 다루기

오디오 재생 중에 특정 시점에서 뭔가를 하고 싶다면 이벤트를 사용하면 돼요.


myAudio.addEventListener('play', () => {
  console.log('음악이 시작됐어요! 🎉');
});

myAudio.addEventListener('pause', () => {
  console.log('음악이 일시정지됐어요. ⏸');
});

myAudio.addEventListener('ended', () => {
  console.log('음악이 끝났어요. 다음 곡 어떠세요? 🎵');
});
  

이벤트를 활용하면 음악 플레이어의 UI를 업데이트하거나, 다음 곡을 자동으로 재생하는 등 다양한 기능을 구현할 수 있어요.

1.8 오디오 시간 다루기

현재 재생 시간을 알고 싶거나, 특정 시점으로 이동하고 싶을 때는 이렇게 해요.


// 현재 재생 시간 얻기
console.log(myAudio.currentTime);

// 특정 시간으로 이동 (초 단위)
myAudio.currentTime = 30; // 30초 지점으로 이동
  

이 기능을 이용하면 음악의 하이라이트 부분으로 바로 이동할 수 있어요. 신나는 부분만 계속 들을 수 있다구요! 👍

1.9 오디오 메타데이터 활용하기

음악 파일에는 제목, 아티스트, 앨범 정보 등의 메타데이터가 포함되어 있을 수 있어요. 이런 정보를 가져와 보여줄 수 있답니다.


myAudio.addEventListener('loadedmetadata', () => {
  console.log('제목:', myAudio.title);
  console.log('아티스트:', myAudio.artist);
  console.log('앨범:', myAudio.album);
  console.log('총 재생 시간:', myAudio.duration);
});
  

이렇게 하면 음악의 상세 정보를 사용자에게 보여줄 수 있어요. 멋진 음악 플레이어를 만들 때 꼭 필요한 기능이죠!

1.10 여러 개의 오디오 동시에 다루기

게임을 만든다면 배경음악과 효과음을 동시에 재생해야 할 수도 있어요. 이럴 때는 여러 개의 Audio 객체를 만들어 사용하면 돼요.


const backgroundMusic = new Audio('background.mp3');
const jumpSound = new Audio('jump.mp3');
const coinSound = new Audio('coin.mp3');

backgroundMusic.loop = true;
backgroundMusic.play();

// 점프할 때
jumpSound.play();

// 코인 먹었을 때
coinSound.play();
  

이렇게 하면 배경음악은 계속 재생되면서 효과음을 원하는 타이밍에 재생할 수 있어요. 완전 프로 개발자 느낌 나죠? 😎

2. JavaScript 비디오 API: 영상의 마법사가 되어볼까요? 🎥

이제 비디오 API로 넘어가볼게요. 오디오랑 비슷한 점도 있지만, 영상이다 보니 좀 더 복잡하고 재미있는 기능들이 많답니다!

2.1 비디오 객체 생성하기

비디오 객체는 HTML에서 <video> 태그를 사용하거나 JavaScript에서 직접 생성할 수 있어요.


// HTML에서
<video id="myVideo" src="awesome_video.mp4"></video>

// JavaScript에서
const myVideo = document.getElementById('myVideo');

// 또는 JavaScript에서 직접 생성
const myVideo = document.createElement('video');
myVideo.src = 'awesome_video.mp4';
document.body.appendChild(myVideo);
  

이렇게 하면 비디오를 재생할 준비가 된 거예요. 쉽죠? ㅋㅋㅋ

2.2 비디오 재생 제어하기

비디오 재생, 일시정지, 정지는 오디오와 거의 똑같아요.


// 재생
myVideo.play();

// 일시정지
myVideo.pause();

// 정지 (처음으로 돌아가기)
myVideo.pause();
myVideo.currentTime = 0;
  

이 기본적인 컨트롤만 있어도 간단한 비디오 플레이어를 만들 수 있어요. 재능넷에서 이런 스킬을 가진 개발자를 찾는 사람들이 많더라구요!

2.3 비디오 볼륨과 음소거

볼륨 조절은 오디오와 동일해요. 하지만 비디오에는 음소거 기능이 추가로 있답니다.


// 볼륨 조절
myVideo.volume = 0.7; // 70% 볼륨

// 음소거 켜기/끄기
myVideo.muted = true; // 음소거 켜기
myVideo.muted = false; // 음소거 끄기
  

음소거 기능은 광고 영상이나 자동 재생 비디오에서 많이 사용돼요. 사용자 경험을 위해 중요한 기능이죠!

2.4 비디오 크기 조절하기

비디오의 크기를 조절하고 싶다면 width와 height 속성을 사용하면 돼요.


myVideo.width = 640;
myVideo.height = 360;
  

이렇게 하면 비디오 크기가 640x360 픽셀로 변경돼요. 반응형 웹을 만들 때는 CSS를 사용해서 더 유연하게 조절할 수 있답니다.

2.5 전체 화면 모드

영화관처럼 비디오를 전체 화면으로 보고 싶다면? 그것도 가능해요!


// 전체 화면으로 전환
if (myVideo.requestFullscreen) {
  myVideo.requestFullscreen();
} else if (myVideo.mozRequestFullScreen) { // Firefox
  myVideo.mozRequestFullScreen();
} else if (myVideo.webkitRequestFullscreen) { // Chrome, Safari, Opera
  myVideo.webkitRequestFullscreen();
} else if (myVideo.msRequestFullscreen) { // IE/Edge
  myVideo.msRequestFullscreen();
}

// 전체 화면 해제
if (document.exitFullscreen) {
  document.exitFullscreen();
} else if (document.mozCancelFullScreen) {
  document.mozCancelFullScreen();
} else if (document.webkitExitFullscreen) {
  document.webkitExitFullscreen();
} else if (document.msExitFullscreen) {
  document.msExitFullscreen();
}
  

브라우저마다 조금씩 다른 메서드를 사용해야 해서 좀 복잡해 보이지만, 이렇게 하면 모든 주요 브라우저에서 전체 화면 모드가 잘 작동한답니다. 😊

2.6 비디오 시간 다루기

비디오의 현재 재생 시간, 총 재생 시간 등을 다루는 방법도 알아볼까요?


// 현재 재생 시간 얻기
console.log(myVideo.currentTime);

// 특정 시간으로 이동
myVideo.currentTime = 120; // 2분(120초) 지점으로 이동

// 총 재생 시간 얻기
console.log(myVideo.duration);

// 남은 재생 시간 계산하기
const remainingTime = myVideo.duration - myVideo.currentTime;
console.log('남은 시간:', remainingTime, '초');
  

이런 기능들을 이용하면 "5분 뒤로 가기", "10초 앞으로 가기" 같은 편리한 기능을 구현할 수 있어요. 넷플릭스 같은 거 만들 수 있겠죠? ㅋㅋㅋ

2.7 비디오 재생 속도 조절하기

비디오도 오디오처럼 재생 속도를 조절할 수 있어요. 2배속으로 강의 듣기, 0.5배속으로 댄스 동작 따라하기 등 다양하게 활용할 수 있죠.


// 재생 속도 설정
myVideo.playbackRate = 2.0; // 2배속
myVideo.playbackRate = 0.5; // 0.5배속
myVideo.playbackRate = 1.0; // 기본 속도로 복귀
  

재생 속도를 바꿔도 음성의 피치는 변하지 않아요. 그래서 2배속으로 들어도 알아들을 수 있는 거죠. 신기하지 않나요? 😮

2.8 비디오 이벤트 활용하기

비디오에도 다양한 이벤트가 있어요. 이를 활용하면 더욱 인터랙티브한 비디오 플레이어를 만들 수 있답니다.


myVideo.addEventListener('play', () => {
  console.log('비디오 재생 시작! 🎬');
});

myVideo.addEventListener('pause', () => {
  console.log('비디오 일시정지 ⏸');
});

myVideo.addEventListener('ended', () => {
  console.log('비디오 재생 끝! 👏');
});

myVideo.addEventListener('timeupdate', () => {
  console.log('현재 재생 시간:', myVideo.currentTime);
});

myVideo.addEventListener('volumechange', () => {
  console.log('볼륨이 변경됐어요:', myVideo.volume);
});
  

'timeupdate' 이벤트는 재생 중 주기적으로 발생해서 현재 재생 시간을 계속 업데이트할 수 있어요. 이걸로 진행 바를 만들 수 있겠죠?

2.9 비디오 트랙 다루기

비디오에는 여러 개의 오디오 트랙이나 자막 트랙이 포함될 수 있어요. 이런 트랙들을 JavaScript로 제어할 수 있답니다.


// 오디오 트랙 가져오기
const audioTracks = myVideo.audioTracks;

// 자막 트랙 가져오기
const textTracks = myVideo.textTracks;

// 특정 오디오 트랙 활성화하기
if (audioTracks.length > 1) {
  audioTracks[0].enabled = false;
  audioTracks[1].enabled = true;
}

// 자막 켜기/끄기
if (textTracks.length > 0) {
  textTracks[0].mode = 'showing'; // 자막 켜기
  // textTracks[0].mode = 'hidden'; // 자막 끄기
}
  

이렇게 하면 다국어 지원이나 청각 장애인을 위한 자막 기능을 구현할 수 있어요. 완전 프로페셔널하죠? 😎

2.10 캔버스와 비디오 합치기

비디오 API와 Canvas API를 함께 사용하면 정말 멋진 효과를 만들 수 있어요. 예를 들어, 비디오에 실시간으로 필터를 적용하거나 비디오 위에 그림을 그릴 수 있답니다.


const video = document.getElementById('myVideo');
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');

video.addEventListener('play', function() {
  function draw() {
    if (video.paused || video.ended) return;

    // 비디오의 현재 프레임을 캔버스에 그리기
    ctx.drawImage(video, 0, 0, canvas.width, canvas.height);

    // 여기에 필터나 효과를 추가할 수 있어요
    // 예: 흑백 필터
    const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
    const data = imageData.data;
    for (let i = 0; i < data.length; i += 4) {
      const avg = (data[i] + data[i + 1] + data[i + 2]) / 3;
      data[i] = avg; // red
      data[i + 1] = avg; // green
      data[i + 2] = avg; // blue
    }
    ctx.putImageData(imageData, 0, 0);

    requestAnimationFrame(draw);
  }
  draw();
});
  

이 코드는 비디오를 캔버스에 그리고, 실시간으로 흑백 필터를 적용하는 예제예요. 이런 식으로 다양한 효과를 만들 수 있답니다. 인스타그램 필터 같은 거 만들 수 있겠죠? ㅋㅋㅋ

3. 실전 예제: 나만의 멋진 미디어 플레이어 만들기 🎨

자, 이제 우리가 배운 것들을 모두 활용해서 멋진 미디어 플레이어를 만들어볼까요? 이 예제를 통해 오디오와 비디오 API를 실제로 어떻게 사용하는지 확실하게 이해할 수 있을 거예요!

3.1 HTML 구조 만들기

먼저 HTML로 기본 구조를 만들어볼게요.


<div id="media-player">
  <video id="myVideo" src="awesome_video.mp4"></video>
  <div id="controls">
    <button id="playPauseBtn">재생/일시정지</button>
    <input type="range" id="progressBar" min="0" max="100" value="0">
    <button id="muteBtn">음소거</button>
    <input type="range" id="volumeBar" min="0" max="1" step="0.1" value="1">
    <button id="fullscreenBtn">전체화면</button>
  </div>
</div>
  

이렇게 하면 비디오와 컨트롤 버튼들이 있는 기본적인 구조가 만들어져요. 이제 여기에 JavaScript로 기능을 넣어볼 거예요!

3.2 JavaScript로 기능 구현하기

이제 진짜 실력 발휘할 시간이에요! JavaScript로 우리의 미디어 플레이어에 생명을 불어넣어볼까요?


// 요소들 가져오기
const video = document.getElementById('myVideo');
const playPauseBtn = document.getElementById('playPauseBtn');
const progressBar = document.getElementById('progressBar');
const muteBtn = document.getElementById('muteBtn');
const volumeBar = document.getElementById('volumeBar');
const fullscreenBtn = document.getElementById('fullscreenBtn');

// 재생/일시정지 기능
playPauseBtn.addEventListener('click', () => {
  if (video.paused) {
    video.play();
    playPauseBtn.textContent = '일시정지';
  } else {
    video.pause();
    playPauseBtn.textContent = '재생';
  }
});

// 프로그레스 바 업데이트
video.addEventListener('timeupdate', () => {
  const progress = (video.currentTime / video.duration) * 100;
  progressBar.value = progress;
});

// 프로그레스 바로 이동하기
progressBar.addEventListener('change', () => {
  const time = (progressBar.value / 100) * video.duration;
  video.currentTime = time;
});

// 음소거 기능
muteBtn.addEventListener('click', () => {
  video.muted = !video.muted;
  muteBtn.textContent = video.muted ? '음소거 해제' : '음소거';
});

// 볼륨 조절
volumeBar.addEventListener('input', () => {
  video.volume = volumeBar.value;
});

// 전체화면 기능
fullscreenBtn.addEventListener('click', () => {
  if (video.requestFullscreen) {
    video.requestFullscreen();
  } else if (video.mozRequestFullScreen) {
    video.mozRequestFullScreen();
  } else if (video.webkitRequestFullscreen) {
    video.webkitRequestFullscreen();
  } else if (video.msRequestFullscreen) {
    video.msRequestFullscreen();
  }
});
  

와우! 이렇게 하면 기본적인 기능을 갖춘 미디어 플레이어가 완성됐어요. 재생/일시정지, 프로그레스 바, 음소거, 볼륨 조절, 전체화면까지 모든 기능이 다 들어있죠. 여러분도 이제 유튜브 개발자?! ㅋㅋㅋ

3.3 스타일 입히기

기능은 완성됐지만, 아직 좀 밋밋해 보이죠? CSS로 예쁘게 꾸며볼게요!