오봉이와 함께하는 개발 블로그
jQuery - 응용 예제(음성 녹음, 녹음 파일 저장) 본문
728x90
응용 예제
- 음성 녹음
- 음성 녹음 ([녹음] / [정지])
- 파일로 저장
- WebRTC
- 별도의 플러그인 없이 웹에서 RTC(Real-Time Communications)를 구현하기 위해 HTML5에 새로 추가된 기능
- https://webrtc.org
음성 녹음 예제 - voiceRecord.html, voiceRecord.js
<script src="jquery-3.6.0.min.js"></script>
<script src= "voiceRecord.js"></script>
<script type="text/javascript">
</script>
</head>
<body>
<button id="record">녹음</button>
<button id="stop">정지</button>
<div id="sound-clips"></div>
</body>
$(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)
})
}
});
728x90
'FE > jQuery' 카테고리의 다른 글
jQuery - canvas 태그 (0) | 2021.12.15 |
---|---|
jQuery - 효과 (0) | 2021.12.15 |
jQuery - DOM 요소 클래스 속성(CSS 동적 적용) (0) | 2021.12.15 |
jQuery - DOM 요소의 추가 및 삭제 (0) | 2021.12.15 |
jQuery - DOM 요소 조작 (0) | 2021.12.15 |
Comments