본문 바로가기
Front/jQuery

응용 예제 - 음성녹음

by Hyeon_ 2021. 12. 15.

응용 예제 - 음성녹음

(1) 음성 녹음

  • 음성 녹음 ([녹음] / [정지])
  • <audio> 컨트롤 출력 play
  • 파일로 저장

WebRTC

  • 별도의 플러그인 없이 웹에서 RTC(Real-Time Communications)를 구현하기 위해 HTML5에 새로 추가된 기능
  • https://webrtc.org
voiceRecord.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JavaScript</title>
    <script src="js/jquery-3.6.0.min.js"></script>
    <script src="js/voiceRecord.js"></script>
</head>
<body>
    <button id="record">녹음</button>
    <button id="stop">정지</button>
    <p></p>
    <div id="sound-clips"></div>
</body>
</html>
voiceRecord.js
$(document).ready(function(){
    const record = document.getElementById('record');
    const stop = document.getElementById('stop');
    const soundClips = document.getElementById('sound-clips');

    if(navigator.mediaDevices){
        var constraints = {
                audio:true
        }

        let chunks = []; // 녹음 데이터 저장하기 위한 변수

        navigator.mediaDevices.getUserMedia(constraints)
        .then(stream => {
            const mediaRecorder = new MediaRecorder(stream);

            // 녹음 버튼 클릭했을 때
            record.onclick = () => {
                mediaRecorder.start(); //녹음 시작
                record.style.background = "red";
                record.style.color = "black";
            };


            // 정지 버튼 눌렀을 때
            stop.onclick = () => {
                mediaRecorder.stop(); // 녹음 정지
                record.style.background = "";
                record.style.color = "";
            };

            mediaRecorder.onstop = e => {
                // (1) <audio> 태그 담을 컨테이너 객체 생성
                const clipcontainer = document.createElement('article');                    

                // (2) audio 객체 생성 및 속성 설정
                const audio = document.createElement('audio');    
                audio.setAttribute('controls', '');

                // (3) 컨테이너에 audio 연결
                clipcontainer.appendChild(audio);

                // <div>에  <audio> 태그 출력
                // 이전에 녹음할 때 추가한 childNode가 존재한다면 제거하고
                if(soundClips.hasChildNodes())
                    soundClips.removeChild(soundClips.childNodes[0]);
                //추가
                soundClips.appendChild(clipcontainer);

                // chunks에 저장된 녹음 데이터를  audio 양식으로 설정
                const blob = new Blob(chunks, {
                    'type': 'audio/mp3 codecs=opus'
                });

                // chunks 초기화 (초기화 하지 않으면 녹음 내용이 누적 저장됨)
                chunks = [];

                // audio 소스 지정
                const audioURL = URL.createObjectURL(blob);
                audio.src = audioURL;


                // (4) 녹음 내용을 파일로 저장
                const clipName = "voiceRecord";

                const a = document.createElement('a');
                clipcontainer.appendChild(a);
                a.href = audio.src;

                a.download = clipName;
                a.click();                
                };


                // 녹음 시작 상태가 되면 chunks에   녹음 데이터 저장
                mediaRecorder.ondataavailable = e => {
                    chunks.push(e.data);
                };

        })
        .catch(err => {
            console.log("오류 발생 : " + err)
        })
    }
});

'Front > jQuery' 카테고리의 다른 글

응용 예제 - <canvas> 태그  (0) 2021.12.15
jQuery - 효과  (0) 2021.12.15
jQuery - DOM 요소의 속성 추가 및 삭제  (0) 2021.12.15
jQuery - DOM 요소 조작  (0) 2021.12.15
jQuery - 이벤트 객체 메소드  (0) 2021.12.15