| PC | Mobile | ||||||||||
| Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | WebView Android | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet |
| 49 | 79 | 65 | 미지원 | 36 | 14.1 | 49 | 49 | 65 | 36 | 14.5 | 5.0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>키위 보이스 레코더 - Kiwi Voice Recorder</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="./lib/jquery-3.7.0.min.js"></script> <script src="./lib/setup.js"></script> <script src="./lib/audioRecorder.min.js"></script> <style> .BUTTON { margin: 0 10px 10px 0; } .visualizer_canvas { width: 100%; height: 200px; background-color: #000000; } #id_timer1 { float:left; } #id_timer2 { float:left; } #max_recording_time { float:left; } .wrap::after { content: ""; display: block; clear: both; } </style> </head> <body> <fieldset id="fieldset_black"> <legend id="legend_black">키위 보이스 레코더 (Kiwi Voice Recorder)</legend> <div id="fieldset_div">• 서비스 신청 및 안내 : <a href="https://www.kiwisoft.kr" target="_blank">https://www.kiwisoft.kr</a></div> <div id="fieldset_div">• Copyright © 앤아이비디앤. All rights reserved.</div> </fieldset> <br><br> <h3>Control1 : 녹음 컨트롤 1</h3> <h4>- 비주얼라이저 (Visualizer) Type: V1 (V1,V2 중에 선택 가능)</h4> <!-- visualizer : 가로,세로 사이즈 및 기본 배경색을 CSS에서 원하는 값을 지정합니다. 비주얼라이저를 사용하지 않는 경우 아래 canvas 태그는 주석처리 하시면 됩니다. --> <canvas id="visualizer_canvas_v1_1" class="visualizer_canvas"></canvas> <br><br> <button type="button" id="recordButton1" onclick="startRecording('visualizer_canvas_v1_1','v1','id_timer1','audio_player1','audio_button1','audio_log1');">녹음시작</button> <button type="button" id="pauseButton1" onclick="pauseRecording('audio_log1')">녹음일시정지(Pause)</button> <button type="button" id="resumeButton1" onclick="resumeRecording('audio_log1')">녹음다시시작(Resume)</button> <button type="button" id="stopButton1" onclick="stopRecording('audio_log1');">녹음종료</button> <h4>- Player : 녹음 종료 후 재생 플레이어가 보여집니다.</h4> <div id="audio_player1"></div> <h4>- Play,Download,Upload : 녹음 종료 후 녹음파일 재생,mp3 다운로드,mp3 업로드 버튼을 생성합니다.</h4> <div id="audio_button1"></div> <h4>- Timer : 녹음 시간 진행 표시</h4> <div class="wrap"> <div id="id_timer1">0:00</div> <div id="max_recording_time">/<script>document.write(recordTimeText());</script></div> </div> <h4>- Log : 녹음 진행 로그를 표시합니다.</h4> <div id="audio_log1"></div> <br><br><hr><br><br> <!-- 한 화면에 녹음 기능을 2개 이상 추가하는 경우 아래 방식으로 추가합니다. --> <h3>Control2 : 녹음 컨트롤 2 (한 화면에 녹음 기능을 2개 이상 추가하는 경우 아래와 같이 추가 가능)</h3> <h4>- 비주얼라이저 (Visualizer) Type: V2 (V1,V2 중에 선택 가능)</h4> <!-- visualizer : 가로,세로 사이즈 및 기본 배경색을 CSS에서 원하는 값을 지정합니다. 비주얼라이저를 사용하지 않는 경우 아래 canvas 태그는 주석처리 하시면 됩니다. --> <canvas id="visualizer_canvas_v2_1" class="visualizer_canvas"></canvas> <br><br> <button type="button" id="recordButton2" onclick="startRecording('visualizer_canvas_v2_1','v2','id_timer2','audio_player2','audio_button2','audio_log2');">녹음시작</button> <button type="button" id="pauseButton2" onclick="pauseRecording('audio_log2')">녹음일시정지(Pause)</button> <button type="button" id="resumeButton2" onclick="resumeRecording('audio_log2')">녹음다시시작(Resume)</button> <button type="button" id="stopButton2" onclick="stopRecording('audio_log2');">녹음종료</button> <h4>- Player : 녹음 종료 후 재생 플레이어가 보여집니다.</h4> <div id="audio_player2"></div> <h4>- Play,Download,Upload : 녹음 종료 후 녹음파일 재생,mp3 다운로드,mp3 업로드 버튼을 생성합니다.</h4> <div id="audio_button2"></div> <h4>- Timer : 녹음 시간 진행 표시</h4> <div class="wrap"> <div id="id_timer2">0:00</div> <div id="max_recording_time">/<script>document.write(recordTimeText());</script></div> </div> <h4>- Log : 녹음 진행 로그를 표시합니다.</h4> <div id="audio_log2"></div> <br><br><hr><br><br> <script src="./lib/audioFunction.min.js"></script> <script src="./lib/appRecorder.js"></script> </body> </html> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | //////////////////////////////////////////////////// // KiwiVoiceRecorder // // https://www.kiwisoft.kr // // Copyright © 앤아이비디앤. All rights reserved. // //////////////////////////////////////////////////// // Kiwi Recorder 서비스 버전 var Kiwi_Recorder_Version = 17; // 라이선스 키 (정식 라이선스키로 수정 등록하세요.) var KVR_LICENSE_KEY = "lJchkbbwGCt66C_"; // 녹음되는 오디오 파일 인코딩 타입 선택 (mp3만 가능합니다.) var encodingTypeSelect = "mp3"; // 최대 녹음 시간(초) - 녹음 시간이 설정 값을 초과하면 자동으로 녹음이 종료됩니다. var recordTimeLimit = 300; // 녹음 전 버튼 클릭 오류 메시지 var recordingCheckErrorMsg = "녹음을 먼저 진행하세요."; var preRecordingCheckErrorMsg = "이전 녹음을 먼저 완료해주세요."; // 한 화면에 녹음 기능을 2개 이상 포함시킨 경우 -> 이전 녹음 완료 전 다음 녹음 버튼을 클릭하였을 경우 // 녹음 로그 메시지 var readyMessage = "> 녹음을 시작합니다."; var startMessage = "> 녹음이 시작되었습니다."; var pauseMessage = "> 녹음을 일시 정지합니다."; var resumeMessage = "> 녹음을 계속 진행합니다."; var stopMessage = "> 녹음이 종료되었습니다."; var endMessage = "> 인코딩이 완료되었습니다."; var uploadSuccessMessage = "업로드가 완료되었습니다."; // MP3 서버 업로드 성공 알림 var uploadFailMessage = "업로드 도중 오류가 발생하였습니다."; // MP3 서버 업로드 실패 알림 var playMessage = "> 녹음 파일을 재생합니다."; var playPauseMessage = "> 녹음 파일 재생을 일시 정지합니다."; var playResumeMessage = "> 녹음 파일을 계속 재생합니다."; // 웹 브라우저 지원 여부 메시지 var chkbrowsermsg = "현재 웹브라우저에서는 녹음 기능을 지원하지 않습니다. 최신 버전의 구글 크롬(Chrome), 마이크로스프트 엣지(Edge) 또는 애플 사파리(Safari) 웹브라우저에서 접속해주세요."; // 녹음 파일 서버 업로드 처리 URL 지정 var uploadUrl = "/Kiwi_Recorder/upload.php"; // mp3lib 경로를 지정합니다.(절대경로) var mp3libUrl = "/Kiwi_Recorder/lib/mp3lib.min.js"; // 비주얼라이저(visualizer) v1 설정 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// var visualizerV1BackColor = "#E2E2E2"; // 배경색상 코드 var visualizerV1LineColor = "#5357FF"; // 라인색상 코드 var visualizerV1lineWidth = 2; // 라인두께 (1,2,3 ...) // 비주얼라이저(visualizer) v2 설정 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// var visualizerV2BackgroundColor = "#E2E2E2"; // 배경색상 코드 /* 비주얼라이저(visualizer) 바(bar) 색상을 선택하거나 직접 색상코드를 설정합니다. 비주얼라이저(visualizer) 바(bar) 색상은 기본으로 제공하는 a,b,c,d 4가지 중에서 한 가지를 선택하여 설정 할 수 있습니다. 기본 제공 색상을 선택하지 않고 색상을 직접 설정 할 경우 색상코드를 입력합니다. ( 예: var visualizerV2BarColor = "#FF0000"; ) */ var visualizerV2BarColor = "a"; // 비주얼라이저(visualizer) 바(bar) 민감도 설정 (비주얼라이저 바의 움직임 정도를 설정합니다. 1 이상의 숫자로 지정하세요. 소수 가능, 기본값: 3) var visualizerV2Sensor = 3; /* 주의사항 : 비주얼라이저는 녹음시에 동작하며 V1, V2 중에서 한 가지만 선택하여 사용할 수 있습니다. V1, V2 모두 true로 적용하여 사용하면 오류가 발생합니다. */ // 아래 코드는 수정하지 마세요. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// var recordTimeText = function() { var recordTimeM = Math.floor(recordTimeLimit / 60); var recordTimeS = recordTimeLimit % 60; if(recordTimeS<10) { recordTimeS = "00"; } if(!recordTimeM || recordTimeM < 1) { recordTimeM = "0"; } var resultTime = recordTimeM + ":" + recordTimeS; return resultTime; }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 | //////////////////////////////////////////////////// // 키위 보이스 레코더 - Kiwi Voice Recorder // // https://www.kiwisoft.kr // // Copyright © 앤아이비디앤. All rights reserved. // //////////////////////////////////////////////////// // 녹음 시작(start) function startRecording(visualizer_canvas_id,visualizer_canvas_ver,timer_id,audio_player,audio_button,audio_log) { _startRecording(visualizer_canvas_id,visualizer_canvas_ver,timer_id,audio_player,audio_button,audio_log); } // 녹음 일시 정지(pause) function pauseRecording(audio_log) { _pauseRecording(audio_log); } // 녹음 다시 시작(resume) function resumeRecording(audio_log) { _resumeRecording(audio_log); } // 녹음 종료(stop) function stopRecording(audio_log) { _stopRecording(audio_log); } // 녹음 진행 과정 로그 표시 /* - audio_log : example.html 소스 코드에서 로그 표시 div id -> "audio_log1" - viewLog 함수명 및 매개변수 변경 금지 */ function viewLog(str, url = null, audio_log) { if($("#"+audio_log).length > 0) { const newDiv = document.createElement("div"); newDiv.appendChild(document.createTextNode(str)); document.getElementById(audio_log).prepend(newDiv); } } // 녹음 종료 후 재생 플레이어 실행 및 녹음파일재생,녹음파일 계속 재생,녹음파일 재생 일시정지,MP3 다운로드,MP3 업로드 버튼 표시 설정 /* - audio_player : example.html 소스 코드에서 플레이어 표시 div id -> "audio_player1" - audio_button : example.html 소스 코드에서 다운로드 및 업로드 버튼 표시 div id -> "audio_button1" - viewRecording 함수명 및 매개변수 변경 금지 - 각 상황에 맞게 플레이어,버튼 등의 표시 여부를 직접 수정할 수 있습니다. */ function viewRecording(url,blobvalue,audio_player,audio_button) { if($("#"+audio_button).length > 0) { $("#"+audio_button).empty(); } if($("#"+audio_player).length > 0) { $("#"+audio_player).empty(); } // 오디오 태그 생성 var newAudio = document.createElement("audio"); newAudio.src = url; newAudio.controls = true; newAudio.id = "player" + Date.now(); // 녹음 파일 재생 오디오 플레이어를 화면에 표시합니다. if($("#"+audio_player).length > 0) { document.getElementById(audio_player).prepend(newAudio); } // mp3 파일 다운로드 하이퍼링크 생성 (사용 시 아래 주석을 제거합니다.) /* if($("#"+audio_button).length > 0) { // 하이퍼링크 태그 생성 const downLink = document.createElement("a"); downLink.href = url; downLink.download = "record_" + Date.now() + ".mp3"; // mp3 파일명 지정 downLink.appendChild(document.createTextNode("mp3 다운로드")); // mp3 파일 다운로드 하이퍼링크를 화면에 표시합니다. document.getElementById(audio_button).prepend(downLink); } */ // mp3 파일 다운로드 버튼 생성 if($("#"+audio_button).length > 0) { var dbuttonID = "downloadButton" + Date.now(); var dbutton = document.createElement("button"); dbutton.type = 'button'; dbutton.id = dbuttonID; dbutton.innerHTML = 'mp3 다운로드'; dbutton.className = 'BUTTON'; dbutton.onclick = function() { const downLink = document.createElement("a"); downLink.href = url; downLink.download = "record_" + Date.now() + ".mp3"; // mp3 파일명 지정 downLink.click(); }; /* mp3 파일 다운로드 버튼을 화면에 표시합니다. */ document.getElementById(audio_button).prepend(dbutton); } // mp3 서버 업로드 버튼 생성 if($("#"+audio_button).length > 0) { var ubuttonID = "uploadButton" + Date.now(); var ubutton = document.createElement("button"); ubutton.type = 'button'; ubutton.id = ubuttonID; ubutton.innerHTML = 'mp3 업로드'; ubutton.className = 'BUTTON'; /* onClick 이벤트로 uploadRecording(blobvalue) 서버 업로드 함수 호출 */ ubutton.onclick = function() { uploadRecording(blobvalue); }; /* mp3 파일 업로드 버튼을 화면에 표시합니다. */ document.getElementById(audio_button).prepend(ubutton); } // 녹음 종료 후 녹음파일 재생(Play) 버튼 생성 if($("#"+audio_button).length > 0) { var pbuttonID = "playButton" + Date.now(); var pbutton = document.createElement("button"); pbutton.type = 'button'; pbutton.id = pbuttonID; pbutton.innerHTML = '녹음파일재생'; pbutton.className = 'BUTTON'; /* onClick 이벤트로 _startPlay(newAudio) 재생(Play) 함수 호출 */ pbutton.onclick = function() { _startPlay(newAudio); }; /* 녹음파일 재생(Play) 버튼을 화면에 표시합니다. */ document.getElementById(audio_button).prepend(pbutton); } // 녹음파일 재생 일시정지(Pause) 버튼 생성 if($("#"+audio_button).length > 0) { var pabuttonID = "pauseButton" + Date.now(); var pabutton = document.createElement("button"); pabutton.type = 'button'; pabutton.id = pabuttonID; pabutton.innerHTML = '녹음파일 재생 일시정지'; pabutton.className = 'BUTTON'; /* onClick 이벤트로 _pausePlay(newAudio.id) 일시정지(Pause) 함수 호출 */ pabutton.onclick = function() { _pausePlay(newAudio.id); }; /* 녹음파일 재생 일시정지(Pause) 버튼을 화면에 표시합니다. */ document.getElementById(audio_button).prepend(pabutton); } // 녹음파일 계속 재생(Resume) 버튼 생성 if($("#"+audio_button).length > 0) { var rebuttonID = "resumeButton" + Date.now(); var rebutton = document.createElement("button"); rebutton.type = 'button'; rebutton.id = rebuttonID; rebutton.innerHTML = '녹음파일 계속 재생'; rebutton.className = 'BUTTON'; /* onClick 이벤트로 _resumePlay(newAudio.id) 재생(Resume) 함수 호출 */ rebutton.onclick = function() { _resumePlay(newAudio.id); }; /* 녹음파일 계속 재생(Resume) 버튼을 화면에 표시합니다. */ document.getElementById(audio_button).prepend(rebutton); } // 녹음 종료 버튼 클릭 후 mp3 서버 업로드 자동 실행 (사용 시 아래 주석을 제거합니다.) // uploadRecording(blobvalue); } // 녹음 파일 웹서버 업로드 function uploadRecording(blobData) { /* 음성 녹음 업로드 파일명을 지정합니다. upload.php 파일 -> $_FILES['voice_record'] 파일 변수명과 일치해야 합니다. 업로드 파일명 변경 및 파일 확장자는 upload.php에서 직접 지정할 수 있습니다. */ var upload_file_name = "voice_record"; if(!blobData) { alert(recordingCheckErrorMsg); } else if(blobData) { console.log("Upload Recording"); var formData = new FormData(); formData.append(upload_file_name,blobData); $.ajax({ url : uploadUrl, async:true, type: "POST", enctype: 'multipart/form-data', data : formData, processData: false, contentType: false, success: function(data, textStatus, jqXHR) { console.log(data); /* 녹음 파일 업로드 처리 서버 스크립트 페이지에서 리턴 받은 값을 확인하여 결과를 처리합니다. 리턴 값은 추가 또는 변경 할 수 있습니다. 예제 upload.php 파일에서 결과 리턴 처리 방법을 확인하세요. */ if($.trim(data) == 'upload_success') { /* 리턴 값이 upload_success인 경우 : 업로드에 성공 했을 경우 결과를 처리합니다. 원하는 처리 코드를 여기에 추가하세요. */ alert(uploadSuccessMessage); } else if($.trim(data) == 'upload_fail') { /* 리턴 값이 upload_fail인 경우 : 업로드에 실패 했을 경우 결과를 처리합니다. 원하는 처리 코드를 여기에 추가하세요. */ alert(uploadFailMessage); } else { alert(uploadFailMessage); } }, error: function (jqXHR, textStatus, errorThrown) { console.log(jqXHR); } }); } } // 녹음 종료(stop) 후 자동 호출되는 이벤트 함수 (함수명 및 매개변수 변경 금지) /* - timer_id : example.html 소스 코드에서 타이머 표시 div id -> "id_timer1" - audio_player : example.html 소스 코드에서 플레이어 표시 div id -> "audio_player1" - audio_button : example.html 소스 코드에서 다운로드 및 업로드 버튼 표시 div id -> "audio_button1" - audio_log : example.html 소스 코드에서 녹음 진행 로그 표시 div id -> "audio_log1" */ function eventStopRecording(timer_id,audio_player,audio_button,audio_log) { console.log('Stop Recording Event'); // 녹음 종료(stop) 후 실행해야 할 코드가 있을 경우 여기에 추가하세요. console.log(timer_id); console.log(audio_player); console.log(audio_button); console.log(audio_log); } // 녹음 시작 시 마이크(미디어 디바이스) 사용 권한 획득 관련 등의 오류로 녹음에 실패하는 경우 자동 호출되는 이벤트 함수 (함수명 변경 금지) function _startRecording_error() { alert('녹음 시작 도중 오류가 발생하였습니다.'); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?php $size = $_FILES['voice_record']['size']; // upload 파일 용량 $input = $_FILES['voice_record']['tmp_name']; // upload 임시 파일명 // 업로드 될 실제 파일명 설정 (서버 업로드 폴더 경로 지정 포함, 파일 확장자는 mp3) $destination = "./upload/voice_record_" . time() . ".mp3"; // 녹음 파일 서버 업로드 if(move_uploaded_file($input, $destination)) { /* 업로드에 성공 했을 경우 upload_success 값을 리턴합니다. 리턴 값은 원하는 다른 값으로 변경 할 수 있습니다. appRecorder.js -> uploadRecording 함수에서 넘겨받은 리턴 값으로 결과를 처리합니다. 여기에 필요한 경우 함께 POST로 넘겨받은 elements 및 녹음 파일명의 Database 저장 등의 처리를 함께 진행합니다. 리턴 값 출력 외에 다른 출력 코드는 사용하지 마세요. */ echo 'upload_success'; } else { /* 업로드에 실패 했을 경우 upload_fail 값을 리턴합니다. 리턴 값은 원하는 다른 값으로 변경 할 수 있습니다. appRecorder.js -> uploadRecording 함수에서 넘겨받은 리턴 값으로 결과를 처리합니다. 리턴 값 출력 외에 다른 출력 코드는 사용하지 마세요. */ echo 'upload_fail'; } ?> |
| 1차 도메인 라이선스 | 770,000 원 (VAT포함) |
| 2차 도메인 추가 구매 라이선스 | 550,000 원 (VAT포함, 라이선스 추가 구매시 적용) |
