• 티스토리 홈
  • 프로필사진
    chantleman
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
chantleman
  • 프로필사진
    chantleman
    • 분류 전체보기 (326)
      • 프로젝트 (1)
      • react (2)
      • 코딩테스트 (133)
        • lv0 (101)
        • lv1 (10)
        • lv2 (7)
        • lv3 (15)
      • 오류 (11)
      • 리눅스 (2)
      • 닷넷 (1)
      • 자바 (67)
        • spring (7)
      • js (38)
      • 오라클 (40)
        • PLSQL (4)
      • cs (7)
      • 도커 aws (3)
      • 단축키 (3)
      • 나만봐 (0)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • 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일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바