- Web Audio API —inputBuffer.getChannelData()2025년 10월 28일
- chantleman
- 작성자
- 2025.10.28.:49
onaudioprocess 이벤트와 inputBuffer.getChannelData()는 Web Audio API에서 실시간 오디오 데이터를 읽고 분석할 때 꼭 알아야 할 핵심 개념입니다.
이번 글에서는 이 두 가지가 어떻게 동작하고, 어떻게 활용할 수 있는지를 예제와 함께 알아보겠습니다.
🔁 onaudioprocess와 event.inputBuffer
onaudioprocess 이벤트는 오디오 데이터가 처리될 때마다 자동으로 호출됩니다.
그때 event.inputBuffer 안에는 현재 입력된 오디오 프레임(버퍼) 이 들어 있습니다.이 inputBuffer는 AudioBuffer 객체이고, 여기에는 오디오 데이터가 채널별로 저장되어 있습니다.
따라서 getChannelData(channelIndex)를 사용하면 해당 채널의 샘플 데이터 배열(Float32Array) 을 얻을 수 있습니다.
📦 getChannelData(channelIndex)란?
- AudioBuffer에서 특정 채널의 오디오 샘플 배열을 반환하는 메서드입니다.
- 결과는 Float32Array 타입이며, 각 값은 -1.0 ~ +1.0 범위의 부동소수(float)입니다.
- 이 배열 하나가 바로 실제 오디오 파형 데이터(진동값) 입니다.
🧩 전체 구조 예시
const audioCtx = new AudioContext(); const processor = audioCtx.createScriptProcessor(4096, 1, 1); processor.onaudioprocess = function(event) { const inputBuffer = event.inputBuffer; // 현재 입력 버퍼 const channelData = inputBuffer.getChannelData(0); // 오디오 샘플 배열(Float32Array) console.log(channelData); }; navigator.mediaDevices.getUserMedia({ audio: true }) .then(stream => { const source = audioCtx.createMediaStreamSource(stream); source.connect(processor); processor.connect(audioCtx.destination); });🎙️ 실시간 볼륨(RMS) 계산 예시
processor.onaudioprocess = function(event) { const input = event.inputBuffer.getChannelData(0); let sum = 0; for (let i = 0; i < input.length; i++) { sum += input[i] * input[i]; } const rms = Math.sqrt(sum / input.length); // Root Mean Square const volume = rms * 1000; // 보기 쉽게 크기 조정 console.log("현재 볼륨:", volume.toFixed(2)); };📌 설명
- getChannelData(0) → 현재 버퍼의 오디오 샘플 배열 가져오기
- 각 샘플(진동값)의 제곱 평균(RMS)을 계산 → 음량 크기(데시벨 유사) 로 변환
- 이 값을 시각화하면 실시간 볼륨 막대(레벨 미터) 를 만들 수 있습니다
🔍 시각적으로 이해하기
getChannelData(0) ↓ [0.01, 0.05, 0.02, -0.03, -0.06, ...] ← 오디오 샘플 데이터 ↓ 음압(진폭) 계산 (RMS) ↓ 실시간 볼륨 표시 또는 파형 시각화이 값들은 오디오의 진동값(파형 데이터) 이기 때문에,
시간의 흐름에 따라 이 값을 그래프로 그리면 실제 오디오 파형 그래프를 만들 수 있습니다728x90'js' 카테고리의 다른 글
녹화 데이터 서버로 보내기 (0) 2025.10.30 Web Audio API — createMediaStreamSource, createScriptProcessor (0) 2025.10.28 checked가 왜 안 풀려? (2) 2025.04.23 apexchart 사용하기 (1) 2025.01.03 .onload 와 .ready() (0) 2024.11.24 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)