실무에서 AudioContext
를 통해서 오디오를 재생하는 앱을 만들고 있었다. 이 앱에서 기능을 추가할 때 앞뒤에 필요 없는 부분을 제외하고 원하는 구간의 오디오를 추출하는 기능을 구현하는 과정에서 OfflineAudioContext
에 대해서 배우게 되었다.
Web Audio API에서 AudioContext
는 실시간으로 오디오를 처리하는 데 사용된다. 그런데 우리가 원하는 것은 실시간으로 오디오를 재생하지 않고, 특정 시간과 길이에 맞게 오디오 파일을 잘라내는 것이다. 여기서 등장하는 것이 바로 OfflineAudioContext
이다.
AudioContext
와 OfflineAudioContext
의 차이점AudioContext는 실시간 오디오 처리에 사용된다. 예를 들어, 웹 브라우저에서 음악을 재생하거나, 실시간으로 오디오 효과를 적용할 때 사용한다.
// 실시간 오디오 처리를 위한 AudioContext 생성
const audioContext = new AudioContext();
// 오디오 소스 생성
const source = audioContext.createBufferSource();
source.buffer = audioBuffer; // 오디오 버퍼 설정
// 오디오 효과 추가
const gainNode = audioContext.createGain();
gainNode.gain.value = 0.5; // 볼륨을 50%로 설정
// 노드 연결
source.connect(gainNode);
gainNode.connect(audioContext.destination);
// 실시간 재생 시작
source.start();
반면, OfflineAudioContext는 실시간 재생 없이 오디오를 처리한다. 이는 오디오 파일을 자르거나, 효과를 미리 적용하거나, 파형을 분석하는 등의 작업에 적합하다. OfflineAudioContext
는 처리가 완료되면 AudioBuffer를 반환한다. (Blob 타입)
OfflineAudioContext
를 선택했나?AudioContext
는 실시간으로 오디오를 재생하면서 처리하는데 특화되어 있다. 이 경우 다량의 오디오를 자르고 붙이려면 하나하나 재생하면서 실시간으로 처리해야 한다. 반면 OfflineAudioContext
는 실시간으로 오디오를 재생하지 않고, 빠르게 오디오를 처리할 수 있다. 이 덕분에 오디오를 자르고 나서 그 결과만 빠르게 얻을 수 있다.
OfflineAudioContext
객체를 만들기 위해 필요한 것들const offlineCtx = new OfflineAudioContext(
2, // 채널 수 (모노는 1, 스테레오는 2)
audieLength * 44100, // 필요한 샘플 수 (오디오 길이에 맞게 계산)
44100 // 샘플 레이트 (사운드의 품질)
);
다음 포스팅에서는 위 OfflineAudioContext를 통해서 직접 오디오를 자르는 코드를 작성해보겠다.